📅  最后修改于: 2023-12-03 15:30:37.656000             🧑  作者: Mango
在使用 Mongoose 时,我们经常需要对模型的某些字段进行枚举限制,以保证数据合法性。Mongoose 提供了 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 范围内的值,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 值的时候使用。下面是一个例子:
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 字段的合法性,从而保证数据安全性。