2017-01-01 72 views
2

我试图在任何地方找到这个问题的答案,但看起来我运气不好。猫鼬{strict:throw}不会抛出错误

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

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.!#$%&’*+/=?^_`{|}~-][email protected][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); 
} 

我做错了什么?

回答

1

如果您添加不属于该模型的部分特性,从mongoose doc

严格的选项(默认启用),确保传递给未在规定 我们的模型构造函数值我们模式没有得到 保存到数据库

它是这样工作即使strict:throw,所以您不必担心没有在模型中引用的其他字段。

关于未触发异常,亚伦在的Heckmann约this post这个会谈有关,这不是一个savestrict : throw触发了异常:

这是怎么猫鼬的作品更多的误解。 'strict' 选项可以验证存储在数据库中的键/值是否为 。模式在文件实例 上创建获取者/设置者,该文件实例被删除到doc.{g,s}et()验证的方法。 附加adhoc数据到猫鼬文档实例不会触发 get/set(),因此不保证验证,因为没有 方式,那天可以保存到数据库。

由于附加字段不是模型的一部分,他们不会触发这些验证所以也不例外被触发(当然,这些字段不保存在数据库中)

异常将被抛出只有当属于该模型的字段未通过验证

+0

有没有办法知道哪些字段没有保存? – Leia

+1

在您的模型中为您的字段添加'required:true'确保它们将被保存,否则它们不是必需的,如果它们不是输入的一部分,则不会被报告 –