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

discord.js v14工单系统触发DiscordAPIError[50035]求助

Discord.js v14工单系统创建频道报错修复

问题场景

使用discord.js v14开发Discord工单系统,已通过console.log确认配置值无误,但点击custom.id为open-ticket的交互组件时触发创建频道错误。

原始代码片段

module.exports = {
    name: 'interactionCreate',
    async execute(interaction, client) {
        const command = client.commands.get(interaction.commandName);

        if (!command && interaction.customId !== "open-ticket") return;

        try {
            if (command) {
                await command.execute(interaction, client);
            } else {
                if (client.guilds.cache.get(interaction.guildId).channels.cache.find(c => c.topic == interaction.user.id)) {
                    return interaction.reply({
                        content: 'Έχετε ήδη δημιουργήσει ένα ticket! Δεν μπορείτε και δεύτερο για αποφυγή spam !',
                        ephemeral: true
                    });
                };


                if (interaction.values[0] == `${config.ticketoption1}`) {
                    console.log(interaction.user.id)
                    interaction.guild.channels.create(`ticket-${interaction.values[0]}-${interaction.user.tag}`, {
                        name: `ticket-${interaction.values[0]}-${interaction.user.username}`,
                        parent: config.parentOpened,
                        topic: interaction.user.id,
                        type: ChannelType.GuildText,
                        permissionOverwrites: [{
                            id: interaction.user.id,
                            allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
                        },
                        {
                            id: config.ticketrole1,
                            allow: ['SEND_MESSAGES', 'VIEW_CHANNEL'],
                        },
                        {
                            id: interaction.guild.roles.everyone,
                            deny: ['VIEW_CHANNEL'],
                        },
                        ],
                    }).then(async c => {
                        interaction.reply({
                            content: `To ticket δημιουργήθηκε στο κανάλι: <#${c.id}>`,
                            ephemeral: true
                        });

                        const embed = new EmbedBuilder()
                            .setColor('#429cf5')
                            .setAuthor({ name: 'Ticket', iconURL: `${config.serverlogo}` })
                            .setDescription(`<@!${interaction.user.id}> δημιουργήθηκε ένα ${interaction.values[0]} ticket!`)
                            .setFooter({ text: `${config.servername}`, iconURL: `${config.serverlogo}` })
                            .setTimestamp();

                        const row = new ActionRowBuilder()
                            .addComponents(
                                new ButtonBuilder()
                                    .setCustomId('close-ticket')
                                    .setLabel('Κλείστε το ticket σας !')
                                    .setEmoji(config.ticketcloseemoji)
                                    .setStyle(ButtonStyle.Danger),
                            );

                        const opened = await c.send({
                            content: `<@&${config.ticketrole1}>`,
                            embeds: [embed],
                            components: [row]
                        });

                        opened.pin().then(() => {
                            opened.channel.bulkDelete(1);
                        });
                    });
                };
        } catch (err) {
            console.error(err);
        }
    }
};

错误信息

632895760937123840
C:\Users\MariosWRLD\Desktop\Programming\Newwwwwwww\Slash v14\node_modules\@discordjs\rest\dist\index.js:933
        throw new DiscordAPIError(data, "code" in data ? data.code : data.error, status, method, url, requestData);
              ^

DiscordAPIError[50035]: Invalid Form Body
name[BASE_TYPE_REQUIRED]: This field is required
    at SequentialHandler.runRequest (C:\Users\MariosWRLD\Desktop\Programming\Newwwwwwww\Slash v14\node_modules\@discordjs\rest\dist\index.js:933:15)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async SequentialHandler.queueRequest (C:\Users\MariosWRLD\Desktop\Programming\Newwwwwwww\Slash v14\node_modules\@discordjs\rest\dist\index.js:712:14)
    at async REST.request (C:\Users\MariosWRLD\Desktop\Programming\Newwwwwwww\Slash v14\node_modules\@discordjs\rest\dist\index.js:1321:22)
    at async GuildChannelManager.create (C:\Users\MariosWRLD\Desktop\Programming\Newwwwwwww\Slash v14\node_modules\discord.js\src\managers\GuildChannelManager.js:170:18) {
  rawError: {
    code: 50035,
    errors: {
      name: {
        _errors: [
          {
            code: 'BASE_TYPE_REQUIRED',
            message: 'This field is required'
          }
        ]
      }
    },
    message: 'Invalid Form Body'
  },
  code: 50035,
  status: 400,
  method: 'POST',
  url: 'https://discord.com/api/v10/guilds/1014637766484697088/channels',
  requestBody: {
    files: undefined,
    json: {
      name: undefined,
      topic: undefined,
      type: undefined,
      nsfw: undefined,
      bitrate: undefined,
      user_limit: undefined,
      parent_id: undefined,
      position: undefined,
      permission_overwrites: undefined,
      rate_limit_per_user: undefined,
      rtc_region: undefined,
      video_quality_mode: undefined,
      available_tags: undefined,
      default_reaction_emoji: undefined,
      default_auto_archive_duration: undefined,
      default_sort_order: undefined,
      default_forum_layout: undefined
    }
  }
}

错误原因与修复方案

核心问题1:channels.create调用方式错误

discord.js v14中GuildChannelManager.create()仅接受一个配置对象参数,但你沿用了v13的写法(第一个参数传名称,第二个传配置),导致实际传递给API的配置对象为空,所有参数都是undefined。

核心问题2:权限字符串格式错误

v14中权限标识符改为驼峰命名,比如SEND_MESSAGES要改成SendMessages,否则权限设置不生效。

核心问题3:config未导入(大概率)

代码中直接使用config变量,但未看到导入语句,导致config.parentOpened等配置值为undefined。

修复后的关键代码片段

// 先确保导入config文件(路径根据实际情况调整)
const config = require('./config.json');
const { ChannelType, PermissionsBitField } = require('discord.js');

// ... 其他代码 ...

if (interaction.values?.[0] === config.ticketoption1) {
    console.log(interaction.user.id);
    // 修正channels.create调用方式
    const ticketChannel = await interaction.guild.channels.create({
        name: `ticket-${interaction.values[0]}-${interaction.user.username}`,
        parent: config.parentOpened,
        topic: interaction.user.id,
        type: ChannelType.GuildText,
        permissionOverwrites: [
            {
                id: interaction.user.id,
                allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel],
            },
            {
                id: config.ticketrole1,
                allow: [PermissionsBitField.Flags.SendMessages, PermissionsBitField.Flags.ViewChannel],
            },
            {
                id: interaction.guild.roles.everyone,
                deny: [PermissionsBitField.Flags.ViewChannel],
            },
        ],
    });

    await interaction.reply({
        content: `To ticket δημιουργήθηκε στο κανάλι: <#${ticketChannel.id}>`,
        ephemeral: true
    });

    // ... 后续嵌入消息和按钮代码保持不变 ...
}

额外注意点

  • 如果open-ticket是按钮组件,则interaction.values不存在,需要去掉interaction.values[0]的判断逻辑,直接创建频道。
  • 添加try/catch块包裹异步操作,避免未捕获的Promise报错。
  • 使用可选链interaction.values?.[0]防止values不存在时触发报错。

内容的提问来源于stack exchange,提问作者Red.1111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:15:01