需要改进的部分
Request Config 中的 timeout
属性
- https://github.com/axios/axios#request-config
- https://axios-http.com/docs/req_config
建议的改进
timeout
属性的描述说:timeout
指定请求超时的毫秒数。如果请求花费的时间超过 timeout
,请求将被中止。
我认为在 Node.js 中这是不正确的。Axios 在这里调用了 request.setTimeout()
,并在内部调用了 socket.setTimeout()
。API 文档解释如下:
设置套接字在套接字上的 timeout
毫秒的不活动后超时。
https://nodejs.org/api/net.html#socketsettimeouttimeout-callback
这意味着套接字在一段时间内没有发送或接收数据时会发出 timeout
事件。在请求负载巨大或网络速度慢的情况下,请求可能会超过指定的 timeout
。
这是重现代码。服务器发送的数据速度很慢,大约需要 10 秒,这比 timeout
更长。
import http from 'http';
import Axios from 'axios';
import timer from 'timers/promises';
(async () => {
const server = http.createServer((req, res) => {
(async () => {
for (let i = 0; i < 100; i++) {
res.write('.');
await timer.setTimeout(100);
}
res.end();
})();
});
await new Promise((resolve) => { server.listen(3000, resolve) });
const startAt = Date.now();
const axios = await Axios.get('http://127.0.0.1:3000', { "timeout": 5000 });
const endAt = Date.now();
console.log(`Received ${axios.data.length} bytes in ${endAt - startAt} ms`);
server.close();
})();
输出:
$ node index.mjs
Received 100 bytes in 10035 ms
相关文件
- 无响应*
2条答案
按热度按时间0h4hbjxa1#
我描述了GET请求可能会超过超时时间。另一方面,我发现当POST请求的负载过大时,如果请求花费的时间超过了超时时间,就会抛出一个超时错误。这种行为取决于axios内部使用的follow-redirects,它与标准的
socket.setTimeout()
不同。GET和POST之间的这种差异是出乎意料的,我在follow-redirects仓库中发现了一些问题。我认为这个问题不仅仅是文档问题。最好你能修复axios(或者follow-redirects)。
wj8zmpe12#
你能把这个问题分配给我吗?