猫鼬条件必填字段
Mongoose conditional required field
应定义模式,以便属性 b
是必需的,前提是属性 a
设置为 false。
const { Schema, model } = require("mongoose");
const schema = new Schema({
a: { type: Boolean, default: false },
b: {
type: Number,
required: function () {
return !this.a;
}
}
});
const Model = model("bla", schema);
Model.validate({a: true});
但是如果我按上面的方式定义架构,最后一行中的验证调用将抛出一个错误,要求 b
,即使 a
设置为 false
:
ValidationError: Validation failed: b: Path `b` is required.
问题是,这不是指模式,而是指函数,并且没有定义值 a
,因此函数只会求值为 true
和 b总是需要的。
使用Model.validate()
,您需要将上下文作为第三个参数传递才能使其正常工作。 issue 中提到的 Model.validate({a: true}, ['b'], {a: true})
之类的东西。或者您可以使用 Document.prototype.validate()
代替:
let model = new Model({a: true});
model.validate();
应定义模式,以便属性 b
是必需的,前提是属性 a
设置为 false。
const { Schema, model } = require("mongoose");
const schema = new Schema({
a: { type: Boolean, default: false },
b: {
type: Number,
required: function () {
return !this.a;
}
}
});
const Model = model("bla", schema);
Model.validate({a: true});
但是如果我按上面的方式定义架构,最后一行中的验证调用将抛出一个错误,要求 b
,即使 a
设置为 false
:
ValidationError: Validation failed: b: Path `b` is required.
问题是,这不是指模式,而是指函数,并且没有定义值 a
,因此函数只会求值为 true
和 b总是需要的。
使用Model.validate()
,您需要将上下文作为第三个参数传递才能使其正常工作。 issue 中提到的 Model.validate({a: true}, ['b'], {a: true})
之类的东西。或者您可以使用 Document.prototype.validate()
代替:
let model = new Model({a: true});
model.validate();