Mongoose 中的 setters 和 getters:规范化数据以及保护属性

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 的 getset 配置,可以进行值得规范化操作,确保 age 在赋值和读取时总是能够被规范化。同时,我们通过 min 值的设定,保护了属性不会被随意地修改。

总结

本文详细介绍了 Mongoose 中 Setters 和 Getters 的概念和使用方法。我们可以使用它们来对模型内部属性进行规范化、衍生计算、展示方式的显式配置,以及加强属性的安全性等等。这些用途可以完全顺应现有需求,提高代码的质量和可维护性。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a23445add4f0e0ffa45ad1


纠错反馈