Mongoose条件性要求确认

ojsjcaue  于 2022-12-19  发布在  Go
关注(0)|答案(4)|浏览(409)

我正在使用mongoose,并尝试设置一个自定义验证,如果另一个属性值被设置为某个值,则该属性将是必需的(即非空)。

thing: {
type: String,
validate: [
    function validator(val) {
        return this.type === 'other' && val === '';
    }, '{PATH} is required'
]}
  • 如果我用{"type":"other", "thing":""}保存模型,它会正确地失败。
  • 如果我用{"type":"other", "thing": undefined}{"type":"other", "thing": null}{"type":"other"}保存模型,则验证函数永远不会执行,并且“无效”数据被写入DB。
l2osamch

l2osamch1#

从mongoose 3.9.1开始,可以在模式定义中向required参数传递一个函数,这样就解决了这个问题。
另见mongoose的对话:https://github.com/Automattic/mongoose/issues/941

njthzxwz

njthzxwz2#

不管出于什么原因,Mongoose的设计者决定,如果字段的值是null,那么就不应该考虑自定义验证,这使得条件验证变得不方便。我发现,解决这个问题的最简单的方法是使用一个高度唯一的默认值,我认为它“类似于null”。

var LIKE_NULL = '13d2aeca-54e8-4d37-9127-6459331ed76d';

var conditionalRequire = {
  validator: function (value) {
    return this.type === 'other' && val === LIKE_NULL;
  },
  msg: 'Some message',
};

var Model = mongoose.Schema({
  type: { type: String },
  someField: { type: String, default: LIKE_NULL, validate: conditionalRequire },
});

// Under no condition should the "like null" value actually get persisted
Model.pre("save", function (next) {
  if (this.someField == LIKE_NULL) this.someField = null;

  next()
});

一个完整的黑客,但它已经为我工作到目前为止。

hsvhsicv

hsvhsicv3#

尝试将此验证添加到type属性,然后相应地调整验证。例如:

function validator(val) {
  val === 'other' && this.thing === '';
}
sf6xfgos

sf6xfgos4#

thing: {
    type: String,
    required: function()[{
        return this.type === 'other';
    }, 'YOUR CUSTOM ERROR MSG HERE']
}

相关问题