2012-01-25 3 views
0

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

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 запросов.

ответ

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

Если вы используете mongoose, то вы можете использовать валидации, поддерживаемые в моделях. Посмотрите validation docs для получения более подробной информации и примеров.

Если вы не используете 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); 
    }); 
    }); 
}