【问题标题】:Mongoose {strict: throw} doesn't throw errorMongoose {strict: throw} 不会抛出错误
【发布时间】:2017-05-16 02:38:53
【问题描述】:

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

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

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
        }
    }
};

而且,当我创建架构时,我选择了在添加不在模型中的属性时引发错误的选项。

new mongoose.Schema(userObject, { strict: "throw" });

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

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

我做错了什么?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    文档说:

    https://mongoosejs.com/docs/guide.html#strict

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

    strict 选项也可以设置为“throw”,这将导致产生错误而不是丢弃坏数据。

    但这并不意味着你认为它意味着什么。

    注意:在您的架构中不存在的实例上设置的任何键/值始终被忽略,无论架构选项如何。

    因此,“不良数据”仅包含 在架构中但格式错误的数据。 架构中的任何额外数据 NOT 都将被静默删除,从而导致最大程度的脱发并违反 POLA。

    【讨论】:

    • 好吧,这似乎是最受好评的答案,所以......很高兴它帮助了其他人,不客气!
    【解决方案2】:

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

    strict 选项(默认启用)确保传递给 我们的模式中未指定的模型构造函数没有得到 保存到数据库

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

    关于未触发的异常,Aaron Heckmann 在this post 中谈到了在savestrict : throw 上未触发的异常:

    这更多是对猫鼬工作原理的误解。 '严格' 选项启用验证试图成为的键/值 存储在数据库中。模式在文档实例上创建 getter/setter 委托给经过验证的doc.{g,s}et() 方法。 将 adhoc 数据附加到 mongoose 文档实例不会触发 get/set(),因此不需要验证,因为没有 那天可以保存到数据库。

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

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

    【讨论】:

    • 有没有办法知道哪些字段没有保存?
    • required: true 放在模型中的字段上确保它们将被保存,否则它们不是必需的,如果它们不是输入的一部分,则不会被报告
    • 感谢您的解释。我认为这个默认值真的很混乱。使用猫鼬的主要好处是验证数据。默默地删除东西没有帮助。最好添加所有内容(甚至是意外数据)或抛出错误。这种无声的失败确实是所有选择中最糟糕的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2018-03-05
    • 2021-04-09
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2016-03-28
    相关资源
    最近更新 更多