【问题标题】:Cannot read properties of undefined (reading "getTextInputValue") discord.js v14无法读取未定义的属性(读取“getTextInputValue”)discord.js v14
【发布时间】:2023-02-21 22:56:08
【问题描述】:

我需要它来输出这个人在模态窗口中写的内容。如果你删除

const reasonn = interaction.fields.getTextInputValue("reason");

线,模式窗口打开,但发送时,机器人崩溃,因为它没有收到响应。

错误:

D:\v144\Events\interactions\Suggestion.js:43
                        const reasonn = interaction.fields.getTextInputValue("reason");
                                                           ^

TypeError: Cannot read properties of undefined (reading 'getTextInputValue')
    at D:\v144\Events\interactions\Suggestion.js:43:60
    at D:\v144\node_modules\mongoose\lib\model.js:5267:18
    at process.processTicksAndRejections (node:internal/process/task_queues:77:11)

Node.js v18.14.1

代码:

const { PermissionFlagsBits, EmbedBuilder, IntegrationApplication, TextInputStyle, TextInputBuilder, ModalBuilder, ActionRowBuilder } = require("discord.js");
const suggestionSchema = require("../../Models/Suggestion");

module.exports = {
    name: "interactionCreate",
    async execute(interaction) {
        const { member, guildId, customId, message } = interaction;

        if (!interaction.isButton()) return;

        if (customId == "suggest-accept" || customId == "suggest-decline") {
            if (!member.permissions.has(PermissionFlagsBits.Administrator))
                return interaction.reply({ content: "No permissions!", ephemeral: true });

            suggestionSchema.findOne({ GuildID: guildId, MessageID: message.id }, async (err, data) => {
                if (err) throw err;

                if (!data)
                    return interaction.reply({ content: "No data was found.", ephemeral: true });

                const embed = message.embeds[0];

                if (!embed)
                    return interaction.reply({ content: "No embed was found.", ephemeral: true });

                switch (customId) {
                    case "suggest-accept":
                        const modal = new ModalBuilder()
                        .setTitle('Accept')
                        .setCustomId('modal')

                        const reason = new TextInputBuilder()
                        .setCustomId('reason')
                        .setRequired(true)
                        .setLabel('Reason')
                        .setStyle(TextInputStyle.Short);

                        const reasons = new ActionRowBuilder().addComponents(reason)

                        modal.addComponents(reasons)
                        interaction.showModal(modal)

                        const reasonn = interaction.fields.getTextInputValue("reason");

                        embed.data.fields[2] = { name: "Status", value: "Accepted", inline: true };
                        embed.data.fields[3] = { name: "Reason", value: `${reasonn}`, inline: true };
                        const acceptedEmbed = EmbedBuilder.from(embed).setColor("Green");

                        message.edit({ embeds: [acceptedEmbed] });
                        interaction.reply({ content: "Suggestion accepted.", ephemeral: true });
                        break;
                    case "suggest-decline":
                        embed.data.fields[2] = { name: "Status", value: "Declined", inline: true };
                        const declinedEmbed = EmbedBuilder.from(embed).setColor("Red");

                        message.edit({ embeds: [declinedEmbed] });
                        interaction.reply({ content: "Suggestion declined.", ephemeral: true });
                        break;
                }
            });
        }
    }
}

我试图做到这一点,以便当一个人点击一个按钮时,会弹出一个带有原因的模式窗口。他必须在那里输入,原因被建议替换。

【问题讨论】:

    标签: javascript discord discord.js


    【解决方案1】:

    这是因为顶部有一个类型保护器。我非常喜欢提前返回,但是如果 interaction 不是 ButtonInteraction,这个 if (!interaction.isButton()) return; 将停止执行它下面的任何代码。因此,您的代码仅适用于 ButtonInteractions 而那些没有 fields 属性,这就是您收到错误的原因。

    您需要检查 interaction 是否为 ModalSubmitInteraction。那就是你模态的fields

    module.exports = {
      name: 'interactionCreate',
      async execute(interaction) {
        const { member, guildId, customId, message } = interaction;
    
        if (interaction.isModalSubmit()) {
          // all code that you want to run after the user submitted the modal
          // interaction.fields.getTextInputValue() is available here
        }
    
        if (interaction.isButton()) {
          // all code that you want to run after the user clicked a button
          // interaction.fields.getTextInputValue() throws error here
        }
      },
    };
    

    【讨论】: