我有以下代码。它向目标服务器发送简单的 GET 请求。
但是,当没有网络服务器侦听给定的IP地址时,节点会保持挂起大约2分钟+ - 完全不尊重超时值 - 应该是几秒钟。
我已经启动了 tcpdump,我注意到节点在这 2 分钟内不断向目标服务器发送 SYN 数据包。
为什么这会发生在 http 库上?我测试了替代库(节点请求(,超时在那里正常工作。但是由于某些原因,我不能使用它,需要坚持使用较低级别的库。
http = require('http');
const options = {
hostname: '52.178.167.109',
port: 80,
path: '/upload',
method: 'GET',
timeout: 5000, //5s timeout
};
const req = http.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
req.end();
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
// Write data to request body
req.end();
root@abc:~# time node test.js
problem with request: connect ETIMEDOUT 52.178.167.109:80
real **2m15.474s** <-------
user 0m0.616s
sys 0m0.084s
超时属性仅适用于套接字不活动。您希望使用 request.setTimeout 来设置读取超时。 github票证 https://github.com/nodejs/node/issues/12005 澄清了这一点。