使用非阻塞代码应该非常棒,但我已经没有想法如何完成这项任务。我必须通过这样做几个db查询来验证一个值:
validate = function() {
var valid = true;
db.collection('posts').findOne({date: ....}, function(err, post){
if (..) valid = false
}
db.collection('posts').findOne({author: .....}, function(err, post){
if (..) valid = false
}
return valid;
}
验证可以以简洁的方式运行是非常好的,但问题是如何返回最终状态。显然我的例子不起作用。该函数将在db查询执行之前返回。
答案 0 :(得分:1)
欢迎来到异步世界。
您应该使用async或fnqueue之类的内容作为控制流, 然后你可以设置一系列验证。
function isValid (mainCallback) {
new FnQueue({
date: function (callback) {
if (...) {
callback();
} else {
callback(new Error('what\'s happened here');
}
},
author: function (callback) {
db.collection('posts').findOne({ author: ..... }, callback);
}
},
function (err, data) {
mainCallback(Boolean(err)); //you should more than this :)
},
1 // concurrency level for serial execution
);
答案 1 :(得分:0)
如果您使用mongoose,则可以使用模型中支持的验证。有关详细信息和示例,请查看validation docs。
如果您没有使用mongoose,那么您需要将回调传递给您的validate函数,并且回调将接收布尔值。此外,您还需要处理功能流,以便它们按顺序或并行运行,具体取决于您的需要。因此,如果它是串联的,以下将起作用:
validate = function(callback) {
var valid = true;
db.collection('posts').findOne({date: ....}, function(err, post){
if (..) {
return callback(true);
}
db.collection('posts').findOne({author: .....}, function(err, post){
if (..) callback(false);
});
});
}