Javascript 有没有办法定义';必需的';模式中有条件的键?

Javascript 有没有办法定义';必需的';模式中有条件的键?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,有没有办法在mongoose模式中有条件地设置“required”字段 例如: if x==true, y's required=true. else y's required=false 当然可以,使用mongoose的中间件。如果您需要某种形式的自定义验证,那么您可以将其连接到可用的挂钩中。一般的验证是在“预保存”时进行的,因此有一个放置钩子的好地方 作为一个完整的例子: var async = require('async'), mongoose = require('mong

有没有办法在mongoose模式中有条件地设置“required”字段

例如:

 if x==true, y's required=true. else y's required=false

当然可以,使用mongoose的中间件。如果您需要某种形式的自定义验证,那么您可以将其连接到可用的挂钩中。一般的验证是在“预保存”时进行的,因此有一个放置钩子的好地方

作为一个完整的例子:

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();
      });
    }
  ]
);
因此,放置在模式定义上的钩子可以检查传入的字段的内容,并确定这些字段是否符合您定义的规则。在这种情况下,当定义“x”时,您希望“y”的值始终存在。这意味着“y”本身是好的,“x”和“y”一起满足规则,但是“y”本身没有“x”将产生错误

有关更多详细信息以及实际验证字段给定值的信息,请参见文档中的