javascript - 有没有办法在模式中有条件地定义 'required' 键?

标签 javascript node.js mongodb mongoose

有没有办法在 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/

相关文章:

javascript - {this.props.children} 返回 null

node.js - 为什么 client.on ("messageCreate"的 TextChannel 中缺少 nsfw 属性?

java - 使用 RepositoryRestResource 注释更改 RESTful 端点不起作用

mongodb - 将 "working set"放入 MongoDB 的 RAM 是什么意思?

javascript - 根据_id限制发布限制

javascript - VUE.JS 将数据传递给 D3 - 做对了吗?

javascript - 使用 JavaScript 在 IE9 中获取数据列表选项

javascript - 抛出错误时如何减少堆栈跟踪(指向调用站点)

javascript - 如何从node.js调用JSON中的数组字段

javascript - 修复错误: Cannot read property 'path' of undefined