处理发布到 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 消息数组的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

怎么把JAVA的数据发送到nodejs服务器上

Heroku 上的 Node JS 消息队列

在nodejs中 Object的toString()方法 querystring的stringify() JSON.stringify()

如何使用消息队列在 Node JS 中执行长事件处理?

如何在 NodeJS 中自定义 keycloak 错误消息

在 Nodejs 中解析大型 JSON 文件并独立处理每个对象