有没有办法在node.js中同步读取HTTP请求体的内容?

时间:2014-06-22 22:46:47

标签: javascript node.js http post

所以我正在向本地运行的node.js HTTP服务器发送HTTP POST请求。我希望从HTTP主体中提取JSON对象,并使用它所拥有的数据在服务器端执行某些操作。

这是我的客户端应用程序,它发出请求:

var requester = require('request');

requester.post(
        'http://localhost:1337/',
        {body:JSON.stringify({"someElement":"someValue"})}, 
        function(error, response, body){
                if(!error)
                {
                        console.log(body);
                }
                else
                {
                        console.log(error+response+body);
                        console.log(body);
                }
        }
);

这是应该接收该请求的服务器:

http.createServer(function (req, res) {

    var chunk = {};
    req.on('data', function (chunk) {                   
        chunk = JSON.parse(chunk);
    });

    if(chunk.someElement)
    {
            console.log(chunk);
            // do some stuff
    }
    else
    {
        // report error
    }

    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Done with work \n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

现在问题是,因为具有回调的req.on()函数异步提取POST数据,所以在完成之前似乎评估了if(chunk.someElement)子句,因此它总是转到else条款,我根本无法做任何事情。

  • 有没有更简单的方法来处理这个问题(简单来说,我的意思是:不是 使用任何其他花哨的库或模块,只是纯节点)?
  • 有吗? 同步函数,执行与req.on()if(chunk.someElement)相同的任务 在我做之前返回身体的内容 {{1}}检查?

1 个答案:

答案 0 :(得分:4)

您需要等待并缓冲请求,并在请求结束时解析/使用JSON'结束'而是因为无法保证所有数据都将作为单个块接收:

http.createServer(function (req, res) {

    var buffer = '';
    req.on('data', function (chunk) {
      buffer += chunk;
    }).on('end', function() {
      var result;
      try {
        result = JSON.parse(buffer);
      } catch (ex) {
        res.writeHead(400);
        return res.end('Bad JSON');
      }

      if (result && result.someElement)
      {
        console.log(chunk);
        // do some stuff
      }
      else
      {
        // report error
      }

      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end('Done with work \n');
    }).setEncoding('utf8');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');