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

时间:2017-01-01 21:29:52

标签: node.js mongodb mongoose

我试图在任何地方找到这个问题的答案,但似乎我没有运气。

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

time.sleep(10)

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

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

  

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

即使使用strict:throw,它的工作方式也是如此,因此您不必担心模型中未引用的其他字段。

关于未触发的异常,Aaron Heckmann在this post中就save strict : throw未触发的异常进行了讨论:

  

这更像是对猫鼬如何运作的误解。 '严格'   选项可以验证尝试的键/值   存储在db中。模式在文档实例上创建getter / setter   对已验证的doc.{g,s}et()方法进行说明。   将 adhoc 数据附加到mongoose文档实例不会触发   get/set()因为没有,所以不保证验证   那天可以保存到数据库。

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

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

答案 1 :(得分:0)

文档说:

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

  

strict选项(默认情况下启用)可确保传递给模型构造函数的未在架构中指定的值不会保存到db

     

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

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

  

注意:无论架构选项如何,都会忽略实例中不存在于实例中的任何键/值。

因此,“错误数据”仅包含架构中 但格式错误的数据。 架构中的所有数据都会被静默删除,从而导致最大的脱发和违反POLA的行为。