处理发布到 Nodejs 服务器的 JSON 消息数组的最佳方法是啥?
Posted
技术标签:
【中文标题】处理发布到 Nodejs 服务器的 JSON 消息数组的最佳方法是啥?【英文标题】:What's the best way to process array of JSON messages posted to Nodejs server?处理发布到 Nodejs 服务器的 JSON 消息数组的最佳方法是什么? 【发布时间】:2012-10-09 02:42:50 【问题描述】:客户端发送一组 JSON 消息以存储在 Nodejs 服务器上;但是客户端将需要对每条消息进行某种确认(通过唯一的 id),它已正确存储在服务器上,因此不需要再次发送。
在服务器上,我想解析 JSON 数组,然后循环遍历它,将每条消息存储在 db 中,将此消息的响应存储在名为响应的 JSON 数组中,最后将此响应数组发送到客户端。但是由于 db 操作是异步的,所有其他代码都在从 db 存储方法返回任何结果之前执行。我的问题是如何不断更新响应数组,直到所有数据库操作完成?
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】:仅当其中的项目数等于您的 result
对象中的键数时发送您的 responses
数组(即,您已经收集了所有它们的响应)。推送数组中的每个响应后,您可以检查是否可以发送。
【讨论】:
【参考方案2】:为了扩展 lanzz 所说的,这是一个非常常见的解决方案(同时启动多个“任务”,然后使用通用回调来确定它们何时都完成)。这是我的 userStats 函数中的函数的快速粘贴,该函数获取活跃用户的数量(DAU、WAU 和 HAU):
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]]);
;
【讨论】:
感谢您的示例,现在每次从 db 模型返回时,我都会在最终回调之前检查密钥长度,并且它已经工作了。以上是关于处理发布到 Nodejs 服务器的 JSON 消息数组的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在nodejs中 Object的toString()方法 querystring的stringify() JSON.stringify()