mongoose 更新資料時不驗證資料(忽略設定的集合規則)的問題
阿新 • • 發佈:2020-09-02
問題:
mongoose 更新資料時不驗證資料(忽略設定的集合規則)的問題
參考:
http://www.mongoosejs.net/docs/api.html#updateone_updateOne
https://mongoosejs.com/docs/validation.html#update-validators
https://segmentfault.com/q/1010000014305255
https://zhuanlan.zhihu.com/p/40122939
Mongoose也支援對update(),updateOne(),updateMany()和findOneAndUpdate()操作的驗證。
預設情況下,更新驗證器處於關閉狀態-您需要指定runValidators選項。
注意:更新驗證器預設情況下處於關閉狀態,因為它們有一些注意事項。(至於是什麼注意事項,官方文件沒寫啊)
// 官方示例:
var toySchema = new Schema({
color: String,
name: String
});
var Toy = db.model('Toys', toySchema);
Toy.schema.path('color').validate(function (value) {
return /red|green|blue/i.test(value);
}, 'Invalid color');
var opts = { runValidators: true };
Toy.updateOne({}, { color: 'not a color' }, opts, function (err) {
assert.equal(err.errors.color.message,
'Invalid color');
});
model.update(conditions, doc, option, function (err, res){})
// conditions-查詢條件 doc-需要更新的資料
// *** 其中res返回 {n:2, nModified:2, ok: 1} ***
// *** n為匹配到的條數 nModified修改的條數 ok 表為是否成功 ***
const option = { // option選項及其預設值
safe: true, // 安全模式
upsert: false, //如果不存在則建立新紀錄
multi: false, // 是否更新多個查詢記錄
runValidators: null, // 如果值為true,執行Validation驗證。
setDefaultsOnInsert: null, // 如果upsert選項為true,在新建時插入文件定義的預設值。
strict: null, // 用嚴格模式跟新
overwrite: false // 禁用update-only模式,允許覆蓋記錄。
}
解決方案:
呼叫Model.updateOne(conditions, doc, [options], [callback]) 方法時,新增 options 屬性 runValidators: true
try {
// 修改資料庫中的值
// 不驗證集合規則
// await Article.updateOne({ _id }, article);
// 驗證集合規則
await Article.updateOne({ _id }, article, { runValidators: true });
} catch (error) {
res.send(error);
}