1. 程式人生 > 實用技巧 >mongoose 更新資料時不驗證資料(忽略設定的集合規則)的問題

mongoose 更新資料時不驗證資料(忽略設定的集合規則)的問題

問題:

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);
}