📜  enum mongoose 不会触发错误 (1)

📅  最后修改于: 2023-12-03 15:30:37.656000             🧑  作者: Mango

Enum Mongoose 不会触发错误

在使用 Mongoose 时,我们经常需要对模型的某些字段进行枚举限制,以保证数据合法性。Mongoose 提供了 Enum 类型来实现这一点。

什么是 Enum 类型

Enum 类型是 JavaScript 中的一种数据类型,它代表一组有限的常量值。在 Mongoose 中,Enum 类型用于限制模型中某些字段的可选值。下面是一个使用 Enum 类型定义某个枚举字段的例子:

const userSchema = new Schema({
  role: {
    type: String,
    enum: ['admin', 'user', 'guest'],
    default: 'guest'
  }
})

在上面的代码中,role 字段的值只能是 'admin'、'user'、'guest' 三者之一,如果查询或者保存时传入的值不在这个范围内,就会抛出一个错误。

Enum 类型不会触发错误

有些开发者在使用 Enum 类型时,认为如果传入一个不在 Enum 范围内的值,Mongoose 会自动抛出一个错误。但实际上,Mongoose 并不会抛出这样的错误。下面是一个例子:

const user = new User({
  role: 'editor'
})
 
user.save()
  .then(...)
  .catch(e => {
    console.error(e)
  })

在上面的代码中,我们创建了一个 user 对象,并且把 role 设为 'editor',这个值并不在 ['admin', 'user', 'guest'] 范围内,但是 Mongoose 并没有抛出错误。因此,我们需要在代码中手动检查这个值是否合法。

手动检查 Enum 值的合法性

我们可以通过预定义一个 Enum 值数据结构,以便在需要检查 Enum 值的时候使用。下面是一个例子:

const UserRole = Object.freeze({
  ADMIN: 'admin',
  USER: 'user',
  GUEST: 'guest'
})
 
const userSchema = new Schema({
  role: {
    type: String,
    enum: [...Object.values(UserRole)],
    default: UserRole.GUEST
  }
})
 
// 在保存之前检查字段合法性
user.pre('save', function() {
  if (!UserRole[this.role]) {
    return Promise.reject(new Error(`Invalid user role: ${this.role}.`))
  }
})

在上面的代码中,我们预定义了一个 UserRole 对象,里面包含了所有合法的用户角色。在模型定义时,我们使用 Object.values(UserRole) 返回 UserRole 对象的所有属性值,并作为 Enum 类型的可选值,此时 Enum 范围内的值永远与 UserRole 对象中的属性值保持一致。在每次保存模型之前,我们检查 role 字段是否合法,如果不合法就抛出一个错误。

使用这种方式,我们就可以在每次保存模型之前检查 role 字段的合法性,从而保证数据安全性。