大音频文件触发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
相关产品推荐
相关产品推荐

