2012-10-18 25 views
0

客戶端發送一組JSON消息存儲在Nodejs服務器上;但是客戶端需要對每條消息進行一些確認(通過唯一的ID),確保它正確存儲在服務器上,因此不需要再次發送。處理髮布到Nodejs服務器的JSON消息數組的最佳方式是什麼?

在服務器我想通過它來解析JSON數組,然後循環,存儲在數據庫的每個消息,在JSON數組命名爲響應此消息存儲響應,最後發送這個迴應陣列到客戶端。但由於數據庫操作是異步的,所有其他代碼在數據庫存儲方法返回任何結果之前執行。我的問題是如何不斷更新響應數組,直到所有數據庫操作完成?

var message = require('./models/message'); 
var async = require('async'); 

var VALID_MESSAGE = 200; 
var INVALID_MESSAGE = 400; 
var SERVER_ERROR = 500; 

function processMessage(passedMessage, callback) { 
var msg = null; 
var err = null; 
var responses = []; 

isValidMessage(passedMessage, function(err, result) { 
if(err) { 
    callback(createResponse(INVALID_MESSAGE, 0)); 
}else{ 
var keys = Object.keys(result); 
for(var i=0, len = keys.length; i<len; i++) { 
async.waterfall([  
    //store valid json message(s) 
    function storeMessage(callback) { 
    (function(oneMessage) { 
     message.processMessage(result[i], function(res) { 
     callback(res, result[i].mid, callback); 
     }); 
    })(result[i]); 
    console.log('callback returns from storeMessage()'); 
    }, 

    //create a json response to send back to client 
    function createResponse(responseCode, mid, callback) { 
    var status = ""; 
    var msg = ""; 

    switch(responseCode) { 
    case VALID_MESSAGE: { 
     status = "pass"; 
     msg = "Message stored successfuly."; 
     break; 
    } 
    case INVALID_MESSAGE: { 
     status = "fail"; 
     msg = "Message invalid, please send again with correct data."; 
     break; 
    } 
    case SERVER_ERROR: { 
     status = "fail"; 
     msg = "Internal Server Error! please contact the administrator."; 
     break; 
    } 
    default: { 

     responseCode = SERVER_ERROR; 
     status = "fail"; 
     msg = "Internal Server Error! please contact the administrator."; 
     break; 
    } 
    } 
    var response = { "mid": mid, "status": status, "message": msg, "code": responseCode}; 
    callback(null, response); 
    }      
], 

function(err, result) { 
    console.log('final callback in series: ', result); 
    responses.push(result);   
}); 
}//loop ends 
}//else ends 
console.log('now we can send response back to app as: ', responses); 
});//isValid finishes 
} 

回答

1

要什麼lanzz說擴大,這是一個很常見的解決方案(啓動一批「任務」都在同一時間,然後使用一個共同的回調,以確定他們都完成)。下面是從我userStats功能,它可以獲取活躍用戶(DAU,WAU,和天后)的數量我的函數的快速粘貼:

exports.userStats = function(app, callback) 
{ 
    var res = {'actives': {}}, 
     day = 1000 * 60 * 60 * 24, 
     req_model = Request.alloc(app).model, 
     actives = {'DAU': day, 'MAU': day*31, 'WAU': day*7}, 
     countActives = function(name, time) { 
      var date = new Date(new Date().getTime() - time); 
      req_model.distinct('username',{'date': {$gte: date}}, function(e,c){ 
       res.actives[name] = parseInt(c ? c.length : 0, 10); 
       if(Object.keys(actives).length <= Object.keys(res.actives).length) 
        callback(null, res); 
      }); 
     }; 


    var keys = Object.keys(actives); 
    for(var k in keys) 
    { 
     countActives(keys[k], actives[keys[k]]); 
    } 
}; 
+0

感謝例如,現在從數據庫模型中的每個回報,我檢查密鑰長度在最終回調之前,它已經工作。 – hash

1

只有當它的項目數等於在你的result對象鍵的號碼發送您的responses陣列(即你收集的回覆爲所有這些)。在您推送陣列中的每個響應之後,您可以檢查是否適合發送。

相關問題