我试图在任何地方找到这个问题的答案,但似乎我没有运气。
我有一个非常简单的猫鼬模型
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" });
我做错了什么?
答案 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的行为。