2017-01-01 115 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'確保它們將被保存,否則它們不是必需的,如果它們不是輸入的一部分,則不會被報告 –