проверка в отношении mongodb с помощью nodejs - PullRequest
0 голосов
/ 25 января 2012

Было бы очень здорово использовать неблокирующий код, но у меня заканчиваются идеи, как выполнить эту задачу.Я должен проверить значение, выполнив несколько запросов в БД, например:

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

Очень хорошо, что проверки могут выполняться параллельным образом, но проблема в том, как вернуть конечное состояние.Очевидно, мой пример не сработает.Функция вернется до выполнения запросов к базе данных.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Добро пожаловать в асинхронный мир.

Вы должны использовать что-то вроде 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
);
0 голосов
/ 25 января 2012

Если вы используете mongoose , то вы можете использовать проверки, которые поддерживаются в моделях.Посмотрите документы проверки для подробностей и примеров.

Если вы не используете mongoose, вам нужно будет передать обратный вызов вашей функции проверки, и обратный вызов получит логическое значение,Кроме того, вам нужно будет управлять потоком ваших функций, чтобы они выполнялись последовательно или параллельно, в зависимости от ваших потребностей.Так что, если он включен последовательно, будет работать следующее:

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);
    });
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...