在使用 Mongoose 进行 Node.js 服务器端开发时,经常会使用虚拟属性来处理需要从数据库中读取多个属性合成一个属性值的场景。在定义虚拟属性时,我们可以通过 setter 和 getter 方法来控制属性的值以及属性值的展示。
什么是虚拟属性
虚拟属性是一种特殊的 Mongoose 属性,它们本身不会被保存到数据库中,而是由其他属性合并而成。
// javascriptcn.com 代码示例 const StudentSchema = new mongoose.Schema({ name: String, age: Number, sex: String }); StudentSchema.virtual('info').get(function() { return `${this.name}, ${this.age}岁,${this.sex}` }); const Student = mongoose.model('Student', StudentSchema); const student = new Student({ name: '张三', age: 20, sex: '男' }); console.log(student.info); // 输出:张三, 20岁, 男
在上面的代码中,我们定义了一个虚拟属性 info
,用于获取学生的基本信息。在虚拟属性的 get
方法中,我们通过模板字符串将学生的姓名、年龄、性别合并成一个字符串并返回。当我们在创建学生对象后,调用 info
属性时,它会自动执行 get
方法并返回计算后的属性值。
使用 setter 和 getter
我们可以通过定义虚拟属性的 getter 和 setter 方法来对属性值进行展示和修改。
使用 getter
// javascriptcn.com 代码示例 const StudentSchema = new mongoose.Schema({ name: String, age: Number, sex: String }); StudentSchema.virtual('info').get(function() { return `${this.name}, ${this.age}岁,${this.sex}` }); const Student = mongoose.model('Student', StudentSchema); const student = new Student({ name: '张三', age: 20, sex: '男' }); console.log(student.info); // 输出:张三, 20岁, 男 // 修改年龄为 22 student.age = 22; console.log(student.info); // 输出:张三, 22岁, 男
在上面的例子中,我们定义了一个虚拟属性 info
,其中的 get
方法用来在读取属性值时展示学生的基本信息。在创建学生对象后,我们修改了他的年龄为 22,再次调用 info
属性时,get
方法会自动执行并返回计算后的属性值。
使用 setter
我们还可以使用虚拟属性的 set
方法来对属性值进行修改。在这里,我们通过 set
方法将学生的年龄转换为字符串类型,并将其赋值给 info
属性。
// javascriptcn.com 代码示例 const StudentSchema = new mongoose.Schema({ name: String, age: Number, sex: String }); StudentSchema.virtual('info').get(function() { return `${this.name}, ${this.age}岁,${this.sex}` }).set(function(value) { const age = parseInt(value); if (age && age !== this.age) { this.age = age; } }); const Student = mongoose.model('Student', StudentSchema); const student = new Student({ name: '张三', age: 20, sex: '男' }); console.log(student.info); // 输出:张三, 20岁, 男 student.info = '张三, 22岁, 男'; console.log(student.age); // 输出:22 console.log(student.info); // 输出:张三, 22岁, 男
在上面的代码中,我们定义了一个虚拟属性 info
,其中的 set
方法用来在设置属性值时修改学生的年龄。在设置 info
属性值时,set
方法会自动执行并将属性值转换为整数类型,然后修改学生的年龄。此外,我们使用了一个判断,如果转换后的年龄和当前年龄相等,则不做任何操作。
总结
通过本文,我们学习了 Mongoose 中虚拟属性的基本概念和使用方法,以及如何通过设置 getter 和 setter 方法来控制虚拟属性的展示和修改。在实际项目中,使用虚拟属性可以方便地处理多个属性合成一个属性值的场景,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6531ae2d7d4982a6eb38c1a8