Discord.js编辑消息时出现内部服务器错误的解决办法
解决Discord.js编辑回复添加Action Row时的Internal Server Error问题
可能的原因及修复步骤
1. 组件构造不符合Discord.js版本规范
如果使用Discord.js v14及以上版本,必须用ActionRowBuilder和ButtonBuilder构造组件,不能直接用普通对象。错误的构造方式会导致Discord服务器解析失败,抛出内部错误。
正确的组件构造示例:
const { ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); // 构造第一行按钮(5个) const row = new ActionRowBuilder() .addComponents( new ButtonBuilder().setCustomId('btn_1').setLabel('按钮1').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_2').setLabel('按钮2').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_3').setLabel('按钮3').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_4').setLabel('按钮4').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_5').setLabel('按钮5').setStyle(ButtonStyle.Primary) ); // 构造第二行按钮(5个) const row2 = new ActionRowBuilder() .addComponents( new ButtonBuilder().setCustomId('btn_6').setLabel('按钮6').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_7').setLabel('按钮7').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_8').setLabel('按钮8').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_9').setLabel('按钮9').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_10').setLabel('按钮10').setStyle(ButtonStyle.Secondary) );
2. 按钮自定义ID重复
Discord不允许同一条消息内存在自定义ID(customId)相同的组件,这会直接触发内部服务器错误。检查所有按钮的customId,确保每个值都是唯一的。
3. 语法或参数格式错误
检查代码是否有语法问题,比如你提供的示例代码第一行await interaction.reply({embeds:[embed]})缺少闭合括号(虽然你说单独更新embed正常,但实际代码中这类错误也可能影响后续操作)。另外,编辑回复时的components数组必须只包含有效的ActionRow实例,不能混入其他类型的对象。
4. 确认Discord组件限制
Discord的组件限制是:
- 每条消息最多5个ActionRow(你只用了2个,符合要求)
- 每个ActionRow最多5个组件(你的每行都是5个按钮,符合要求)
所以行数不是问题,排除这个怀疑方向。
完整修复后的代码示例
const { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder } = require('discord.js'); // 初始embed const embed = new EmbedBuilder() .setTitle('初始消息') .setDescription('等待5秒后更新...'); // 更新后的embed const embed2 = new EmbedBuilder() .setTitle('更新后的消息') .setDescription('已添加按钮行'); // 构造按钮行 const row = new ActionRowBuilder() .addComponents( new ButtonBuilder().setCustomId('btn_1').setLabel('按钮1').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_2').setLabel('按钮2').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_3').setLabel('按钮3').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_4').setLabel('按钮4').setStyle(ButtonStyle.Primary), new ButtonBuilder().setCustomId('btn_5').setLabel('按钮5').setStyle(ButtonStyle.Primary) ); const row2 = new ActionRowBuilder() .addComponents( new ButtonBuilder().setCustomId('btn_6').setLabel('按钮6').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_7').setLabel('按钮7').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_8').setLabel('按钮8').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_9').setLabel('按钮9').setStyle(ButtonStyle.Secondary), new ButtonBuilder().setCustomId('btn_10').setLabel('按钮10').setStyle(ButtonStyle.Secondary) ); // 执行逻辑 await interaction.reply({ embeds: [embed] }); await new Promise(r => setTimeout(r, 5000)); await interaction.editReply({ components: [row, row2], embeds: [embed2] });
内容的提问来源于stack exchange,提问作者MrEthanVlogsandGames
相关产品推荐
相关产品推荐

