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

问题描述 投票:0回答:2

因此,我将 HTTP POST 请求发送到本地运行的 node.js HTTP 服务器。我希望从 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)
    检查?
javascript node.js http post
2个回答
5
投票

您需要等待并缓冲请求,并在请求的“结束”事件上解析/使用 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/');

0
投票

我在 2023 年编写了 sync-request-curl,这将有助于发送同步 HTTP 请求。

您可以使用以下命令安装库

npm install sync-request-curl

该库包含原始 sync-request 中功能的子集,但利用 node-libcurl 以获得更好的性能和 NodeJS 的附加 libcurl 选项。

这是 GET 请求的基本用例:

// import request from 'sync-request-curl';
const request = require('sync-request-curl');
const response = request('GET', 'https://ipinfo.io/json');
console.log('Status Code:', response.statusCode);
console.log('body:', response.body.toString());

请查阅文档以获取更多示例。

具体到您的代码片段,您可以将其重写为

const request = require('sync-request-curl');

const response = request(
  'POST',
  'http://localhost:1337',
  {
    json: {
      someElement: 'someValue'
    }
  }
);

if (response.statusCode !== 200) {
  console.log(`Error: ${response.statusCode}`);
}
console.log(response.body.toString('utf-8'));

希望这有帮助:)。

© www.soinside.com 2019 - 2024. All rights reserved.