【问题标题】:nodejs req.on('end', callback) doesn't work propertynodejs req.on('end', callback) 不起作用属性
【发布时间】:2021-10-27 17:58:42
【问题描述】:

我目前正在使用 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' 的回调。

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

感谢您的帮助!

【问题讨论】:

  • 您显示的代码仅显示了一个请求,但您显示的日志有多个请求。请显示发出多个请求的上下文。如果您想对事物进行排序,那么这就是需要修复代码的地方,而不是您展示的内容。例如,如果这是在 for 循环或任何类型的循环内,则请求不会阻塞,因此您将同时有多个请求在进行中。像这样的请求是异步的。他们不会在运行其余代码之前等待完成。
  • 谢谢! autually 他们确实在一个循环中,上面的代码只是循环中的一部分。但是,我遇到的问题是有时响应 req.on('end') 没有发出,导致缓冲区没有被清除(响应没有正确重新组装)。你对这个问题有什么想法吗?谢谢!
  • 如果您需要多个请求的帮助,您将不得不公开发出多个请求的代码。不知道我们如何才能提供其他帮助。你会发现 stackoverflow 对你的工作效率更高,如果你不等到第二天才回复试图帮助你的人,会有更多人愿意帮助你。这个地方与互联网论坛的工作方式不同,您可以在其中转储问题并在第二天回来查看发生了什么。当这个地方更具互动性时,它的效果会更好。

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


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • 感谢@rsp 的提示,实际上上面的代码是在一个单独的辅助函数中,它将被主代理调用。它将频繁调用此函数以将数据包发送到另一个服务。所以我认为如果我说多次调用这个函数并经常发送许多请求会更准确。但是,看起来某些响应没有发出 req.on('end') 回调。 你的意思是如果我多次调用这个例程来发送多个请求,我需要确保在上一个请求发起之后调用了代码 sn-p 吗??干杯!
【解决方案2】:

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

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

看这里nodejs.org event-finish

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 2020-12-29
    • 2015-10-22
    • 2018-03-12
    • 1970-01-01
    • 2016-02-06
    • 2013-05-06
    相关资源
    最近更新 更多