验证没有工作mongoose

时间:2017-02-07 10:29:45

标签: javascript node.js mongodb mongoose

我正在使用Monggose 4.8.1。我有一个简单的架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var Organisation = new mongoose.Schema({
  name: {
    type: String,
    required: [true, 'Organisation name must be provided'],
    unique: [true, 'Organisation name must be unique']
  },
  createdBy: { 
    type: String, 
    ref: 'User'
  },
  createdOn: {
    type: Date,
    "default": Date.now
  },
  availableUntil: {
    type: Date
  }
});

mongoose.model('Organisation', Organisation);

我已将电子邮件email@domain.com保存在文档中。

现在我想尝试再次保存它,首先使用validateAsync检查它是否有效。所以我希望收到错误,因为电子邮件不是唯一的。

var organisation = new Organisation({
    name: 'email@domain.com'
});

var validResult = organisation.validateSync();

console.log('validResult is ', validResult);

但是validResult总是undefined ...

修改

我在架构中添加了一个额外的属性:

  eggs: {
    type: Number,
    min: [6, 'Too few eggs'],
    max: 12
  }

然后尝试保存eggs: 3,这就产生了错误。奇怪的是,即使在模式中设置,mongoose验证似乎也不会检查值是否唯一...

2 个答案:

答案 0 :(得分:1)

对于此类验证,您可以使用pathvalidate来完成此过程。

架构中的

var OrganisationSchema = new mongoose.Schema({
  name: {
    type: String,
    required: [true, 'Organisation name must be provided']
  }
 //....
});


OrganisationSchema.path('name').validate(function(value, done){
  var self = this;
  if(!self.isNew){
    return done(true);
  }else{
   //mongoose.models['Organisation'] or self.model('Organisation')
    mongoose.models['Organisation'].count({name: value}, function(err, count){
      if(err){
        return done(err);
      }

      return done(!count)
    });
  }
}, "This email already exists" );


mongoose.model('Organisation', OrganisationSchema);

答案 1 :(得分:0)

标记。

您是否可以验证mongodb是否包含已保存型号的记录:db.organisations.find()

看起来如果您有undefined值,则表示文档已按照validateSync()的文档通过了验证步骤:

  var err = doc.validateSync();
  if ( err ){
    handleError( err );
  } else {
    // validation passed
  }