discord.js v13实现Reaction roles功能报DiscordAPIError 404错误如何解决?
错误原因
- 核心报错404的直接触发原因:你传入的频道ID
798996288258703382不存在,或者你的机器人没有权限访问该频道,Discord API找不到对应资源返回404状态码。 - 代码存在未定义变量的逻辑错误:EditMessage.js中当判断频道无消息时,直接调用了
message.channel.send(),但该作用域下根本没有定义message变量,会触发额外运行错误。 - 不符合discord.js v13的语法规范:v13版本不能直接将MessageEmbed实例作为send方法的参数传递,必须包裹在
embeds数组中才能正常发送嵌入消息。 - 缺少必要的网关Intent:discord.js v13要求显式开启
GUILDS、GUILD_MESSAGES、GUILD_MESSAGE_REACTIONS等相关Intent,否则无法正常拉取频道、消息资源,也可能触发404类报错。
修复方案
1. 排查基础配置
- 确认填写的频道ID正确无误,机器人已经加入该频道所属服务器,并且拥有
查看频道、发送消息、管理消息、添加反应的权限。 - 确认机器人初始化时已经开启了必要的Intent,参考初始化代码:
const { Client, Intents } = require('discord.js'); const client = new Client({ intents: [ Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MESSAGE_REACTIONS ] });
2. 修复EditMessage.js代码
修正后的完整代码如下:
const addReactions = (message, reactions) => { message.react(reactions[0]) reactions.shift() if(reactions.length > 0) { setTimeout(() => addReactions(message, reactions), 500) } } module.exports = async (client, id, embed, reactions = []) => { try { const channel = await client.channels.fetch(id) const messages = await channel.messages.fetch() if(messages.size === 0) { // 修复未定义变量问题,适配v13嵌入发送语法 const newMessage = await channel.send({ embeds: [embed] }) addReactions(newMessage, reactions) } else { // 直接编辑第一条消息即可,无需遍历所有消息 const targetMessage = messages.first() await targetMessage.edit({ embeds: [embed] }) // 可选:如果需要重置原有反应可先执行 await targetMessage.reactions.removeAll() addReactions(targetMessage, reactions) } } catch (err) { // 增加错误捕获方便后续定位问题 console.error('反应身份组功能出错:', err) } }
内容的提问来源于stack exchange,提问作者Asuka
相关产品推荐
相关产品推荐

