使用nodejs验证mongodb

时间:2012-01-25 11:56:23

标签: node.js mongodb

使用非阻塞代码应该非常棒,但我已经没有想法如何完成这项任务。我必须通过这样做几个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查询执行之前返回。

2 个答案:

答案 0 :(得分:1)

欢迎来到异步世界。

您应该使用asyncfnqueue之类的内容作为控制流, 然后你可以设置一系列验证。

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);
    });
  });
}