nodejs req.on(' end',callback)不起作用

时间:2017-04-04 16:20:28

标签: javascript node.js callback node-modules node-https

我目前是使用nodejs的建筑物代理,它使用以下语法发送和接收https请求和响应。然而,在我的项目中,响应有点大,所以通常情况下,req.on('数据',回调)将在req.on之前调用5~7次(' end&#39 ;,回调)被调用。

以下是简化的代码结构:

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的结尾缺失。

简而言之,我们需要确保&#39; end&#39;在多次回复req.on之后立即调用一次(&#39;数据&#39;,回调)。

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

从您提供的代码中,无法发出两个请求。它提出了一个请求:

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

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

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

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

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

这里没有任何内容可能导致同时发出两个请求。但即使第一个(也是唯一的)请求尚未开始,您已经调用.write().end()方法,因此可能存在您的问题。

除了你应该期待在另一个请求完成之前启动一个请求如果你要并行做几个请求,因为你说你喜欢到。