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
相关产品推荐
相关产品推荐

