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)
我究竟做错了什么?
如果您添加不属于模型的属性,来自mongoose doc:
strict 选项(默认启用)确保传递给模型构造函数的、模式中未指定的值不会保存到数据库中
即使使用 ,它也可以这样工作strict:throw,因此您不必担心模型中未引用的其他字段。
关于未触发的异常,Aaron Heckmann 在这篇文章中讨论了未在 with 上触发的save异常strict : throw:
这更多的是对猫鼬工作原理的误解。“strict”选项可以验证尝试存储在数据库中的键/值。模式在文档实例上创建 getters/setters,这些实例委托给
doc.{g,s}et()经过验证的方法。将临时数据附加到猫鼬文档实例不会触发get/set(),因此不保证验证,因为无法将这一天保存到数据库中。
由于附加字段不是模型的一部分,因此它们不会触发这些验证,因此不会触发异常(当然这些字段不会保存在数据库中)
仅当属于模型的字段未通过此验证时才会引发异常
| 归档时间: |
|
| 查看次数: |
2545 次 |
| 最近记录: |