Mongoose 是一种使用 Node.js 编写的优秀的 MongoDB ODM,因为其提供了丰富的 API 和灵活的数据建模机制,很受开发者的欢迎。在 Mongoose 中,Setters 和 Getters 是两个十分重要的概念,它们可以帮助我们规范化数据以及保护属性。本文将详细介绍 Mongoose 中的 Setters 和 Getters,以及如何使用它们来提高代码的质量和可维护性。
Setters 和 Getters 是什么
在 Mongoose 中,Setters 和 Getters 分别是对模型内部属性(Document Property)的设置器和获取器。一个 Setter 就是一个能够将模型内部属性的值进行转换和规范化的函数,而一个 Getter 则是一个能够获取模型内部属性的值并返回给调用方的函数。
如果你之前接触过 Vue.js,那么你可以把 Setters 和 Getters 看作是一个对象的计算属性。在 Mongoose 中,Setters 和 Getters 可以用来规范化数据,为不同场景下的属性值提供不同的展示方式,或是保护属性,不让用户随意更改某些属性。
Setters 的使用
假设我们现在有一个用户模型:
const userSchema = new Schema({ name: String, password: String, email: String })
我们已经定义好了 Mongoose 的 Schema,现在我们需要增加一个 Setter,用来对用户的密码进行加密。我们可以将加密函数定义在 Schema 上面:
const encryptPassword = password => { // ... return encryptedPassword }
然后在 userSchema 中定义 Setter 如下:
userSchema.path('password').set(function (password) { return encryptPassword(password) })
这样,在我们创建新用户之后,密码将自动被加密,而无需在其他地方手工调用加密函数,这样有利于提高代码的可维护性。
Getters 的使用
在使用 Getters 的场景下,我们可以像下面这样为用户模型中的属性设置展示方式:
userSchema.virtual('passwordLength').get(function () { if (this.password) { return this.password.length } return 0 })
在上面的代码中,我们为 Schema 定义了一个绑定到虚拟键 passwordLength
的 Getter,它可以计算出用户密码的长度,我们可以将这个虚拟键passwordLength
直接用于调用方,而无需去手工计算用户密码的长度。
保护属性
Mongoose 还提供了另一种使用场景,即可以通过 Setters 和 Getters 来保护属性。这种场景下,我们可以防止数据表单被意外地篡改。例如:
const personSchema = new Schema({ name: String, age: { type: Number, get: (v) => Math.round(v), set: (v) => Math.round(v), min: 0 } })
在上面的示例中,age 属性采用了 Mongoose 的 get
和 set
配置,可以进行值得规范化操作,确保 age 在赋值和读取时总是能够被规范化。同时,我们通过 min 值的设定,保护了属性不会被随意地修改。
总结
本文详细介绍了 Mongoose 中 Setters 和 Getters 的概念和使用方法。我们可以使用它们来对模型内部属性进行规范化、衍生计算、展示方式的显式配置,以及加强属性的安全性等等。这些用途可以完全顺应现有需求,提高代码的质量和可维护性。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a23445add4f0e0ffa45ad1