Mongoose自动转换字段值类型且未触发类型报错是什么原因?
原因说明
Mongoose默认开启了**自动类型转换(Casting)**特性,会尝试将传入值转为Schema定义的字段类型,只要转换成功就不会抛出错误:
String类型字段:所有非null/undefined的可序列化值都会自动调用toString()方法转换,你传入数字12会被转为字符串"12"存储Number类型字段:只要传入的字符串内容是合法的数值格式,会自动用Number()构造函数转换,你传入字符串'18'会被转为数字18存储
如果你需要严格校验类型、不允许自动转换,可以用以下两种方案实现:
方案1:关闭字段的自动转换能力
直接在字段配置里加cast: false,只要传入值和定义类型不匹配,就会直接抛出校验错误:
const User = mongoose.model('User', { name: { type: String, cast: false }, age: { type: Number, cast: false } });
也可以全局关闭所有字段的自动转换:
mongoose.set('cast', false);
方案2:添加自定义类型校验器
如果不想完全关闭自动转换,只需要强校验传入的原始类型,可以用自定义校验器实现:
const User = mongoose.model('User', { name: { type: String, validate: { validator: val => typeof val === 'string', message: 'name字段必须传入字符串类型' } }, age: { type: Number, validate: { validator: val => typeof val === 'number', message: 'age字段必须传入数字类型' } } });
内容的提问来源于stack exchange,提问作者Othman9095
相关产品推荐
相关产品推荐

