You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:54:08