有没有办法在 Mongoose 模式中有条件地设置“必填”字段? .
示例:
if x==true, y's required=true. else y's required=false
最佳答案
当然可以,使用 mongoose 的中间件。如果您需要某种形式的自定义验证,那么您可以将其连接到可用的 Hook 中。一般验证发生在“预保存”中,因此有一个放置 Hook 的好地方。
作为一个完整的例子:
var async = require('async'),
mongoose = require('mongoose'),
Schema = mongoose.Schema;
mongoose.connect('mongodb://localhost/test');
var testSchema = new Schema({
x: Number,
y: Number
});
testSchema.pre('save', function(next) {
if ( this.x && !this.y ) {
return next(new Error("y is required when x is set"));
}
next();
});
var Test = mongoose.model("Test", testSchema, "test");
async.series(
[
function(callback) {
var test = new Test({ y: 1 });
test.save(function(err,test) {
if (err) {
console.log( err );
} else {
console.log("test1: ok");
}
console.log( "y only expected to work");
callback();
});
},
function(callback) {
var test = new Test({ x: 1 });
test.save(function(err,test) {
if (err) {
console.log( err );
} else {
console.log("test2: ok");
}
console.log("x only expected to fail");
callback();
});
},
function(callback) {
var test = new Test({ x: 1, y: 1});
test.save(function(err,test) {
if (err) {
console.log( err );
} else {
console.log("test3: ok");
}
console.log("x and y is fine");
callback();
});
}
]
);
所以放置在模式定义上的钩子(Hook)可以检查传入的字段的内容,并确定它们是否符合您定义的规则。在这种情况下,您正在寻找在定义“x”时始终存在的“y”值。这意味着“y”本身没问题,“x”和“y”一起满足规则,但是“y”本身没有“x”会产生错误。
参见 middleware在文档中了解更多详细信息以及 validation用于实际验证为字段提供的值。
关于javascript - 有没有办法在模式中有条件地定义 'required' 键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24480513/