首页 > 解决方案 > 在转换为模式类型猫鼬之前验证原始传入值

问题描述

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

我有这样的模型架构(删除其他属性,如名称、密码等)

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 表示真或 0 表示假。我做了一些测试,我得到的是:

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

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

标签: javascriptmongodbmongoosemongoose-schema

解决方案


Mongoose 将尽可能将模型的值转换为模式中定义的类型。

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

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

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

如果您不希望在Number SchemaType值不是 number 类型时强制转换,则有一种解决set方法可以为该属性定义自定义方法。此set方法接收模型的原始值作为参数,并将在转换之前执行,因此您有机会返回一个无法转换为数字的值,例如非空字符串。这样,猫鼬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。

请查看猫鼬文档以获取更多信息。


推荐阅读