-1

我目前正在使用 nodejs 构建代理,它使用以下语法来发送和接收 https 请求和响应。但是在我的项目中,响应有点大,所以通常 req.on('data', callback) 会在 req.on('end', callback) 被调用之前被调用 5~7 次。

这是简化的代码结构:

var http = require("https");
var options = {
    hostname: '<WEB SERVICE>',
    port: 80,
    path: '<WEB PATH>',
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    }
};
var response = "";
var req = http.request(options, function(res) {
    res.setEncoding('utf8');
    res.on('data', function (body) {
        console.log("data");
        response += body;
    });

    res.on('end', function () { 
        console.log("end");
        response = "";
    });
});
req.on('error', function(e) {
     console.log('problem with request: ' + e.message);
});
// write data to request body
req.write('<SOMETHING>');
req.end();

理想情况下,当多个请求进来时,日志记录顺序应该是:

data, data, data, data, data, end, data, data, data, data, end

即一旦完成一个请求,end 将被调用一次。

但是,在做了几次测试后,反应很大。序列变为:

<response 1 comes>data, data, data ..... data <response 2 comes> data, data,       data, ..., data, end

即缺少请求 1 的结尾。

简而言之,我们需要确保在多次回调 req.on('data', callback) 之后立即调用 'end' 的回调。

我相信必须有一些通用的方法来解决这个问题(似乎是节点中的一个经典错误),如果有人能指出如何解决这个属性,我将不胜感激。

谢谢您的帮助!

4

2 回答 2

0

从您包含的代码中,不可能发出两个请求。它提出一个请求:

var req = http.request(options, function(res) { ... });

然后在此处绑定错误处理程序:

req.on('error', function(e) { ... });

然后在等待对请求的任何响应之前,甚至在建立连接之前,它调用请求对象上的方法.write().end()

req.write('<SOMETHING>');
req.end();

这里没有什么可能导致同时发出两个请求。但是,即使第一个(也是唯一一个)请求尚未开始,您已经调用.write().end()方法,所以也许有您的问题。

除此之外,如果您要按照您所说的那样并行执行几个请求,您应该期望在另一个请求完成之前启动一个请求。

于 2017-04-04T16:34:18.977 回答
0

我之前有同样的问题,我是这样解决的:

res.on('finish', function () { 
    console.log("res finished");
});

看这里nodejs.org 事件完成

于 2021-10-27T09:58:42.307 回答