有没有办法在模式中有条件地定义“必需”键?

时间:2014-06-29 21:37:47

标签: javascript node.js mongodb mongoose

有没有办法在mongoose架构中有条件地设置'required'字段?

示例:

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

1 个答案:

答案 0 :(得分:3)

当然可以,使用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();
      });
    }
  ]
);

因此,放置在模式定义上的钩子可以检查传入的字段的内容,并确定它们是否符合您定义的规则。在这种情况下,您正在寻找“y”的值,在定义“x”时始终存在。这意味着“y”本身很好,“x”和“y”一起符合规则,但“y”本身没有“x”会产生错误。

有关详细信息,请参阅文档中的middleware以及validation以实际验证为字段指定的值。