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

大音频文件触发DOMException [AbortError]问题修复咨询

修复Discord机器人大音频文件上传AbortError及重复消息问题

问题根源

触发的DOMException [AbortError]来自@discordjs/rest的默认超时机制:大音频文件上传请求耗时超过了库的默认超时阈值(通常15秒),AbortController主动中止请求;同时库默认的3次重试策略导致重复发送消息,且未捕获异常的代码直接终止。

可行修复方案

1. 延长请求超时时间

针对大文件上传的耗时,手动设置更长的超时阈值,覆盖@discordjs/rest的默认值:

// 全局设置REST实例的超时(推荐)
const { REST, Routes } = require('discord.js');
const rest = new REST({ 
  version: '10', 
  timeout: 30000 // 设置为30秒,可根据文件大小调整
}).setToken(process.env.DISCORD_TOKEN);

// 或针对单个上传请求单独设置超时
await rest.post(Routes.channelMessages(channelId), {
  body: { content: '音频上传完成', files: [audioFile] },
  timeout: 45000 // 单个请求45秒超时
});

2. 捕获AbortError并阻止重复操作

通过try/catch捕获超时异常,避免程序崩溃,同时只发送一次失败提示:

try {
  await rest.post(Routes.channelMessages(channelId), {
    body: { content: '音频上传完成', files: [audioFile] },
    timeout: 30000
  });
} catch (error) {
  if (error.name === 'AbortError') {
    // 仅发送一次超时提示,覆盖重试导致的重复消息
    await rest.post(Routes.channelMessages(channelId), {
      body: { content: '音频上传超时,请尝试压缩文件后重试' }
    });
  } else {
    console.error('上传失败:', error);
  }
}

3. 调整或禁用默认重试机制

@discordjs/rest默认重试3次,这是重复消息的直接原因,可通过配置修改:

// 创建REST实例时禁用重试
const rest = new REST({ 
  version: '10', 
  timeout: 30000,
  retryLimit: 0 // 设为0禁用重试,或设为1减少重试次数
}).setToken(process.env.DISCORD_TOKEN);

4. 优化大文件上传方式

  • 压缩音频文件:降低比特率、采样率或裁剪时长,减少文件体积,从根源缩短上传时间。
  • 使用分片上传:@discordjs/rest支持自动分片上传大文件,避免单次请求超时:
    const { AttachmentBuilder } = require('discord.js');
    const audioFile = new AttachmentBuilder('large-audio.mp3', { name: 'processed-audio.mp3' });
    
    await rest.post(Routes.channelMessages(channelId), {
      body: { content: '正在分片上传音频...', files: [audioFile] },
      timeout: 60000 // 分片上传需更长超时时间
    });
    

内容的提问来源于stack exchange,提问作者mev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:42:14