2012-01-25 16 views
0

ノンブロッキングコードを使用するのは非常にすばらしいことですが、このタスクをどのように実行するかというアイデアが不足しています。私はそうのようないくつかのDBクエリを行うことで値を検証する必要があります。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; 
} 

検証がconcurent的に実行できることは非常に良いですが、問題は、最終的な状態を返す方法です。明らかに私の例はうまくいかないでしょう。この関数は、dbクエリ実行の前に戻ります。

答えて

1

ようこそasyncの世界へ。

制御フローには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関数にコールバックを渡す必要があり、コールバックにはブール値が渡されます。また、必要に応じて、関数が直列または並列に実行されるように関数のフローを処理する必要があります。したがって、シリーズ内にある場合は、次のように動作します。

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