在转换为模式类型猫鼬之前验证原始传入值

Validate original incoming value before cast to type on schematype mongoose

如何在将传入值转换为我们在 属性 类型中指定的类型之前验证传入值的类型?

我有一个这样的模型模式(删除名称、密码等其他属性)

const User = mongoose.model('User', {
    age : {
        type: Number, // type of data 
        default: 0, // if don't provided, client will has 0 for age value
        validate(value) { // 
            console.log(typeof(value));

            if(value === null){ 
                throw new Error("Age can not be empty string, really ?")
            } else if(value < 0) {
                throw new Error('Age must be a positive number')
            }
        }
    }
})

然后我尝试创建一个新用户,但我尝试将布尔值赋给年龄,它变成值 1 表示 true 或 0 表示 false。我做了一些测试,我得到的是:

  1. validate 函数的值是转换为 Number 类型后的新值,所以在 validate() 函数中,可以是 1 或 0

  2. 即使我将 validate() 函数放在 type: Number 之前。仍然得到值是 1 或 0.

只要有可能,Mongoose 就会将模型的值转换为模式中定义的类型。

转换是在创建模型实例时完成的。

在将模型实例保存到数据库之前检查模型实例的有效性。

因为转换是在有效性检查之前完成的,所以您得到的值已经在 validate 函数中转换。

如果您不希望在值不是类型时转换 Number SchemaType number,有一个变通方法为 属性 定义自定义 set 方法。这个 set 方法接收模型的原始值作为参数,它将在转换之前执行,所以你有机会 return 一个不能转换为数字的值,例如 a不是空字符串。这样,猫鼬将在尝试保存模型实例时抛出 ValidationError

像这样:

const User = mongoose.model('User', {
    age : {
        type: Number, // type of data 
        default: 0, // if don't provided, client will has 0 for age value
        set: v => typeof v !== 'number' ? 'Throw error' : v    
    }
});

对于 Boolean SchemaType,您可以使用属性 convertToTrueconvertToFalse 分别定义应将哪些值转换为 true 或 false。

请查看mongoose documention了解更多信息。