我制作了测试用例演示,您可以使用单个命令克隆和运行:
https://github.com/nemanjam/axios-timeout-error-demo
它并不是每次都会失败,但可能在 70% 的情况下都会失败。令人困惑的是,代码没有做任何特别的事情,它只是通过 url 简单地获取 html 页面。
我假设http服务器正在做一些不寻常的事情,导致Axios客户端触发超时错误。任何其他 http 客户端都会发生同样的情况,例如 fetch。
我尝试设置一些axios配置来防止错误,但没有成功,仍然触发超时异常。
// src/axios-instance.ts
export const axiosConfig = {
timeout,
// important to terminate connection and prevent timeout exception
httpsAgent: new Agent({
keepAlive: true,
timeout,
scheduling: 'fifo',
}),
};
/** Must use singleton. */
export default class MyAxiosInstance {
private static instance: AxiosInstance;
public static getInstance(): AxiosInstance {
if (!MyAxiosInstance.instance)
MyAxiosInstance.instance = axios.create(axiosConfig);
return MyAxiosInstance.instance;
}
}
你们中的一些人能否使其每次执行可靠、成功的页面获取而不触发任何异常,并提供发生了什么情况的逻辑解释?
服务器经常对速率限制请求进行计时,因此您必须对其进行计时。
在 axios 文档页面上有一个示例。
const {data} = await axios.post(LOCAL_SERVER_URL, myBuffer, {
onUploadProgress: ({progress, rate}) => {
console.log(`Upload [${(progress*100).toFixed(2)}%]: ${(rate / 1024).toFixed(2)}KB/s`)
},
maxRate: [100 * 1024], // 100KB/s limit
});