【发布时间】: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