我正在使用 Mocha 在我的 API 中進行一些測驗,我注意到當我有一個欄位unique: true并且我在重復欄位上進行測驗時,我所有的pre('save')仍然被呼叫。難道我做錯了什么?
用戶.js
const UserSchema = new Schema({
email: {
type: String,
unique: true
}
});
UserSchema.pre('save', function test(next) {
console.log(123);
});
測驗.js
var user1 = await User.findOne({ email: "[email protected]" });
var user2 = new User({ email: "[email protected]" });
await user2.save()
安慰:
123
MongoError: E11000 duplicate key error collection (...)
這是我的測驗影像。在“有效時創建新檔案”中,我創建了兩個新用戶。在“電子郵件是唯一的......”測驗中,我嘗試使用與之前創建的電子郵件相同的電子郵件創建另一個。“1234567”是我放在 pre hook 中的 console.log。
uj5u.com熱心網友回復:
經過大量研究后,我發現事情是如何使用獨特的和預掛鉤的。
這是解決此類問題的最佳方法。
編輯:這個答案的一些細節,因為泰勒指定它可能會變得無效。
就我而言,我的預存具有與關系有關的關鍵邏輯。因此,當我嘗試保存無效檔案時,它的所有關系都與錯誤的檔案相關聯。
由于異步預鉤子被一起呼叫,我必須保證我的唯一驗證在所有事情之前被呼叫。Using.path('field').validate是迄今為止我發現的最好的方法,因為它甚至在.pre('validate'). 這是我的代碼:
UserSchema.path('email').validate(async function validateDuplicatedEmail(value) {
if (!this.isNew && !this.isModified('email')) return true;
try {
const User = mongoose.model("User");
const count = await User.countDocuments({ email: value });
if (count > 0) return false;
return true;
}
catch (error) {
return false;
}
}, "Email already exists");
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414592.html
標籤:
上一篇:無法連接到資料庫。重試
下一篇:使用貓鼬更新檔案中的嵌套物件
