使用猫鼬在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');
}
});
}
我在做什么错了?
答案 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);
}
在仅需要计数文件的情况下, countDocuments
是find
的更好选择。