自定义验证器,cb不是函数

时间:2018-07-12 00:04:31

标签: javascript node.js mongodb mongoose

使用猫鼬在node.js中使用自定义验证程序的问题。我试图在插入之前先检查query中是否存在headerLog

我的代码如下:

var mongoose = require('mongoose'); //layer above mongodb
var Schema = mongoose.Schema;

var headerLogSchema = new Schema({
    query: { type: String, required: true, unique: true, validate: {
          validator: function(v, cb) {
            HeaderLog.find({query: v}, function(err, documents){
               cb(documents.length == 0);
            });
          },
          message: 'Header already exists in log, didnt save this one.'
        }
    }
})

var HeaderLog = mongoose.model('headerLog', headerLogSchema);

module.exports = HeaderLog;

错误:TypeError: cb is not a function

我这样调用此函数:

function logHeader(query) {
  var newHeaderLog = new HeaderLog({
    query: query
  })

  newHeaderLog.save(function(err) {
    if (err) {
      console.log(err);
    }
    else {
      console.log('New header logged');
    }
  });
}

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

如果您查看异步验证器示例here in the doc,则似乎必须传递选项isAsync: true才能告诉猫鼬您正在使用异步验证器,因此它应该传递回调

var headerLogSchema = new Schema({
    query: { 
       type: String, 
       required: true, 
       unique: true, 
       validate: {
          isAsync: true,                   // <======= add this
          validator: function(v, cb) {
            HeaderLog.find({query: v}, function(err, documents){
               cb(documents.length == 0);
            });
          },
          message: 'Header already exists in log, didnt save this one.'
        }
    }
})

答案 1 :(得分:0)

the reference所述,异步验证器应具有isAsync标志:

validate: {
  isAsync: true,
  validator: function(v, cb) { ... }
}

或退还诺言。由于验证者已经使用了另一个模型,并且Mongoose模型是基于诺言的,因此使用现有的诺言很有意义:

  validator: function(v) {
    return HeaderLog.find({query: v}).then(documents => !documents.length);
  }
在仅需要计数文件的情况下,

countDocumentsfind的更好选择。