Mongoose {strict: throw} 不会抛出错误

Lei*_*eia 6 mongoose mongodb node.js

我试图到处寻找这个问题的答案,但似乎我不走运。

我有一个非常简单的猫鼬模型

var userObject = {
    profile: {
        username: {
            type: String,
            required: true,
            lowercase: true
        },
        firstname: {
            type: String,
            required: true
        },
        lastname: {
            type: String,
            required: true
        },
        img: {
            type: String,
            required: true,
            match: /^(https?:\/\/)/i
        },
        email: {
            type: String,
            match: /^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/,
            required: true
        },
        singupdate: {
            type: Date,
            default: Date.now
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

而且,当我创建模式时,我选择了在添加不在模型中的属性时抛出错误的选项。

new mongoose.Schema(userObject, { strict: "throw" });
Run Code Online (Sandbox Code Playgroud)

这就是我试图捕捉错误的方式。当我添加有效属性时,该过程会运行并记录创建的文档,但是当我添加无效属性时,该过程永远不会退出,并且日志永远不会出现在控制台上。

try {
    User.create(users, function(err, docs) {
        console.log("err: " + err);
        console.log("docs: " + docs);
    });
} catch (e) {
    console.log(e.message);
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Ber*_*tel 3

如果您添加不属于模型的属性,来自mongoose doc

strict 选项(默认启用)确保传递给模型构造函数的、模式中未指定的值不会保存到数据库中

即使使用 ,它也可以这样工作strict:throw,因此您不必担心模型中未引用的其他字段。

关于未触发的异常,Aaron Heckmann 在这篇文章中讨论了未在 with 上触发的save异常strict : throw

这更多的是对猫鼬工作原理的误解。“strict”选项可以验证尝试存储在数据库中的键/值。模式在文档实例上创建 getters/setters,这些实例委托给doc.{g,s}et()经过验证的方法。将临时数据附加到猫鼬文档实例不会触发 get/set(),因此不保证验证,因为无法将这一天保存到数据库中。

由于附加字段不是模型的一部分,因此它们不会触发这些验证,因此不会触发异常(当然这些字段不会保存在数据库中)

仅当属于模型的字段未通过此验证时才会引发异常

  • 感谢您的解释。我认为这个默认值确实令人困惑。使用猫鼬的主要好处是数据验证。默默地删除东西没有帮助。最好要么添加所有内容(甚至是意外的数据),要么抛出错误。这种无声的失败确实是所有选择中最糟糕的。 (4认同)