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

时间:2019-04-03 15:50:58

标签: javascript mongodb mongoose mongoose-schema

在将传入值转换为我们在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')
            }
        }
    }
})

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

    validate函数上的
  1. 值是转换为Number类型后的新值,因此,对于validate()函数,它可以为1或0

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

1 个答案:

答案 0 :(得分:0)

猫鼬会尽可能将模型的值转换为架构中定义的类型。

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

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

由于强制转换是在有效性检查之前完成的,因此您将在validate函数中获取已经强制转换的值。

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

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

请检查mongoose documention以获得更多信息。