Discord.js模态框提交报错‘Something went wrong! Try again!’求助
提交Discord工单模态框报错的解决办法
问题原因
showModal无消息返回值:你把interaction.showModal(modal)的返回值存到modalMessage里,但这个方法根本不会返回消息对象,后续调用modalMessage.editReply会直接触发未定义错误。- 交互类型判断错误:
modalResponse是模态框提交交互(ModalSubmitInteraction),用isMessageComponent()判断永远为false,导致后续代码完全不执行,且未对模态框提交做任何回应,Discord因此抛出“提交表单出错”提示。
修复后的完整代码
async function createTicketModal(interaction, ticketType) { if (interaction.deferred || interaction.replied) { return; } const modal = new ModalBuilder() .setCustomId('ticketModal') .setTitle(`${ticketType} - 工单`); const questionModal = new TextInputBuilder() .setCustomId('questionModal') .setLabel('请描述你的问题。') .setStyle(TextInputStyle.Paragraph); const firstActionRow = new ActionRowBuilder().addComponents(questionModal); modal.addComponents(firstActionRow); // showModal无需接收返回值,直接调用即可 await interaction.showModal(modal); try { const modalResponse = await interaction.awaitModalSubmit({ filter: (i) => i.customId === "ticketModal" && i.user.id === interaction.user.id, time: 60000, }); // 正确获取模态框输入框内容 const description = modalResponse.fields.getTextInputValue('questionModal'); const channel = await interaction.guild.channels.create(`${interaction.user.username}-ticket`, { type: ChannelType.GuildText, permissionOverwrites: [ { id: interaction.guild.id, deny: PermissionsBitField.Flags.ViewChannel, }, { id: interaction.user.id, allow: [ PermissionsBitField.Flags.ViewChannel, PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.AttachFiles ], }, ], }); if (!channel.isTextBased()) { await modalResponse.reply({ content: `创建${ticketType}工单的文本频道失败。`, ephemeral: true }); return; } const embed = new EmbedBuilder() .setTitle(`${ticketType}工单`) .setDescription(`问题描述:${description}`) .setColor('#0099ff'); await channel.send({ content: `${interaction.user}`, embeds: [embed] }); // 必须回应模态框提交,告知用户操作结果 await modalResponse.reply({ content: `${ticketType}工单已创建,去${channel}查看吧`, ephemeral: true }); } catch (error) { console.error(error); // 根据交互状态选择合适的错误提示方式 if (!interaction.replied && !interaction.deferred) { await interaction.followUp({ content: `创建${ticketType}工单时出错,请稍后重试。`, ephemeral: true }); } else if (interaction.replied) { await interaction.editReply({ content: `创建${ticketType}工单时出错,请稍后重试。`, embeds: [], components: [], }); } } }
核心修复说明
- 移除
showModal的返回值赋值,该方法不需要返回消息对象。 - 改用
getTextInputValue指定输入框ID获取内容,比直接取values[0]更可靠。 - 删除错误的
isMessageComponent()判断,模态框提交交互不属于消息组件类型。 - 必须对
modalResponse调用reply,Discord要求所有交互必须在3秒内得到回应,否则会触发报错。 - 替换为Discord.js v14的枚举类型(
ChannelType、PermissionsBitField.Flags),避免字符串拼写错误导致的权限或频道类型问题。 - 错误处理中区分交互的不同状态,确保错误提示能正常发送。
内容的提问来源于stack exchange,提问作者Illanser
相关产品推荐
相关产品推荐

