我在猫鼬中创建了架构
let userSchema = new Schema({
name: {
type: String,
required: true,
lowercase: true,
trim: true,
minLength: 4,
maxLength: 15
}
});
当我使用此查询更新它时
user.updateOne(
{ "_id" : body.id },
{ $set: {
name:body.name,
phone:body.phone,
designation:body.designation,
address:body.address
} }
).then(function (updateDate) {
var data={message:"success",data:updateDate}
callback(data)
}).catch(function (err) {
var data={message:"error",data:err}
callback(data);
});
如果我更新2长度的字符串,它不会引发任何错误。关于stackoverflow的解决方案很少,但对我而言这些解决方案不起作用
验证是中间件。猫鼬默认将验证注册为每个模式上的pre('save')钩子。
而且还提到Notes on findAndUpdate() and Query Middleware:
未在update(),findOneAndUpdate()等上执行pre和post save()钩子
因此,在您的函数中,验证程序不会运行。您可以通过在选项中添加runValidators: true
来解决它(更多信息here)。
minLength
必须为minlength
,并且maxLength
必须为maxlength
,且小写字母为[[l。所以您的架构必须是这样的:
let userSchema = new Schema({
name: {
type: String,
required: true,
lowercase: true,
trim: true,
minlength: 4,
maxlength: 15
}
});
其次,如Cuong的回答所述,您需要向updateOne添加{runValidators: true}
选项。
默认情况下,更新验证器处于关闭状态-您需要指定runValidators选项。
所以您的代码必须是这样的:
user.updateOne( { _id: body.id }, { $set: { name: body.name, phone: body.phone, designation: body.designation, address: body.address } }, { runValidators: true } ) .then(function(updateDate) { var data = { message: "success", data: updateDate }; callback(data); }) .catch(function(err) { var data = { message: "error", data: err }; callback(data); });