提问人:Miroslav Popov 提问时间:12/4/2021 最后编辑:Miroslav Popov 更新时间:12/5/2021 访问量:633
NodeJS,HTTP 请求有时不调用回调
NodeJS, HTTP Request doesn't Call a Callback Sometimes
问:
我正在 Nodejs 下开发一个 Request 服务。我在生产中使用它一年多了,它工作正常,但是,在某些情况下它会卡住。它很少发生在特定类型的请求中,但我无法隔离和修复这种情况。
当请求不调用 .看起来我错过了某种错误事件。我抓住了:,,,......callback
error
abort
timeout
end
我错过了什么?
function sendRequest(options, postData, callback) {
const req = https.request(options, reqCallback);
req.on('error', (err) => {
callback(err.message, null);
});
req.on('abort', () => {
callback('Request abort', null);
});
req.on('timeout', () => {
callback('Request timeout', null);
});
if (postData) {
req.write(postData);
}
req.end();
function reqCallback(res) {
const chunks = [];
res.on('data', (chunk) => {
chunks.push(chunk);
});
res.on('end', () => {
let body = null;
let err = null;
try {
body = Buffer.concat(chunks).toString();
} catch (e) {
err = e.message;
}
callback(err, body);
});
res.on('aborted', () => {
callback('Response aborted', null);
})
}
}
答:
0赞
Miroslav Popov
12/5/2021
#1
当目标服务器保持请求打开状态并且没有响应时,请求似乎挂起。
我添加了一个标题。它接受以秒为单位的时间。但是,服务器可能会也可能不会执行超时。Request-Timeout
我直接在请求中添加了超时,如下所示。
function sendRequest(options, postData, callback) {
const req = https.request(options, reqCallback)
if (options.headers && typeof options.headers['Request-Timeout'] === 'number') {
req.setTimeout(options.headers['Request-Timeout'] * 1000)
}
req.on('timeout', () => {
// Destroy the request to prevent a double callback call.
req.destroy()
})
// ...
}
我还在事件处理程序的正文中添加了一个特定的。
如果服务器决定在某个时刻做出响应,它会阻止后续的回调调用。req.destroy()
timeout
评论