Discord.js机器人出现Axios 1000ms超时未处理Promise rejection报错
问题原因
- 直接触发报错的原因是你调用的
https://no-api-key.com公共接口响应速度变慢,你的axios默认超时阈值设置为1000ms,接口响应超过这个时长就会触发超时错误。 - 日志中出现
UnhandledPromiseRejectionWarning说明你贴出的这段代码不是异常来源:这段代码已经用try/catch做了异常捕获,不会漏出未处理的Promise拒绝到全局。大概率是你项目其他位置还有axios调用,使用了.then()写法但未配套写.catch(),或者其他异步逻辑没有做异常捕获。 - 机器人延迟飙升到30000ms是因为未处理的Promise拒绝、无限制的超时重试逻辑阻塞了Node.js事件循环,占用了主线程处理资源。
解决方案
1. 调整请求超时配置
给该接口请求单独设置更合理的超时阈值,覆盖全局默认的1000ms配置,修改对应代码如下:
const url = 'https://no-api-key.com/api/v2/animals/cat'; let image; let fact; try { // 单独设置超时时间为5000ms,可根据接口实际响应速度调整 const { data } = await axios.get(url, { timeout: 5000 }); console.log(data); image = data.image; fact = data.fact; } catch (e) { console.log(e) return message.channel.send('An error occured, please try again!'); }
2. 补全全局异常捕获定位漏处理的请求
给Node进程添加全局未捕获Promise拒绝监听,定位具体是哪段代码抛出的未处理异常:
process.on('unhandledRejection', (reason, promise) => { console.error('未捕获的Promise拒绝,对应promise:', promise, '异常原因:', reason); });
定位到对应请求后,给该请求补充try/catch或者.catch()异常处理逻辑即可消除警告。
3. 可选:添加超时重试逻辑
如果该接口频繁出现超时问题,可以增加超时自动重试逻辑,注意设置最大重试次数避免无限重试占用资源:
const MAX_RETRY_TIMES = 3; // 最多重试3次 // 封装带重试的请求方法 async function getWithRetry(url, options, retryCount = 0) { try { return await axios.get(url, options); } catch (err) { // 仅超时错误且未到最大重试次数时才重试 if (err.code === 'ECONNABORTED' && retryCount < MAX_RETRY_TIMES) { return getWithRetry(url, options, retryCount + 1); } throw err; } } // 调用示例 const { data } = await getWithRetry(url, { timeout: 5000 });
内容的提问来源于stack exchange,提问作者8less
相关产品推荐
相关产品推荐

