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

Discord.js模态框提交报错‘Something went wrong! Try again!’求助

提交Discord工单模态框报错的解决办法

问题原因

  1. showModal无消息返回值:你把interaction.showModal(modal)的返回值存到modalMessage里,但这个方法根本不会返回消息对象,后续调用modalMessage.editReply会直接触发未定义错误。
  2. 交互类型判断错误: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:55:05