最小长度验证器在猫鼬中不起作用

问题描述 投票:1回答:2

我在猫鼬中创建了架构

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的解决方案很少,但对我而言这些解决方案不起作用

javascript node.js mongodb mongoose
2个回答
0
投票
在文档here中,它表示:

验证是中间件。猫鼬默认将验证注册为每个模式上的pre('save')钩子。

而且还提到Notes on findAndUpdate() and Query Middleware

未在update(),findOneAndUpdate()等上执行pre和post save()钩子

因此,在您的函数中,验证程序不会运行。您可以通过在选项中添加runValidators: true来解决它(更多信息here)。


0
投票
首先,在您的架构中,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); });

© www.soinside.com 2019 - 2024. All rights reserved.