Discord.js频道重命名命令触发ReferenceError等报错求助
问题说明
- 开发目标:基于discord.js编写Discord机器人频道重命名斜杠命令
- 运行报错:
ReferenceError: msg is not definedTypeError: Cannot read properties of undefined (reading 'channel')
问题根因
- 代码为斜杠命令逻辑,执行回调只接收
interaction交互对象,全程没有定义msg变量,所有调用msg.xxx的代码都会触发未定义错误 - 多余引入Node.js内置模块
diagnostics_channel导出的channel,属于无效依赖,和业务变量存在命名冲突风险 - 命令选项中定义的
channel是字符串类型,存储用户输入的新频道名称,不是频道对象;原逻辑混淆了新频道名和目标频道对象,要修改触发命令的当前频道应直接取interaction.channel channel.setName()是异步接口,未加await会导致时序问题,可能出现频道名还没改完就发送成功提示的情况- 斜杠命令的触发是交互事件,不存在普通消息场景下的触发消息对象,原逻辑里的
msg.delete()属于无效代码,斜杠命令没有可删除的用户触发消息
修复后代码
const fs = require('fs'); const Discord = require('discord.js'); const yaml = require('js-yaml'); const supportbot = yaml.load( fs.readFileSync('./Configs/supportbot.yml', 'utf8') ); const cmdconfig = yaml.load(fs.readFileSync('./Configs/commands.yml', 'utf8')); const Command = require('../Structures/Command.js'); // 已删除无效的diagnostics_channel引入 module.exports = new Command({ name: cmdconfig.RenameCommand, description: cmdconfig.RenameCommandDesc, options: [ { name: 'channel', description: '指定新的频道名称', type: 'STRING', required: true, }, ], async run(interaction) { const { getRole } = interaction.client; let ModDiscord = await getRole(supportbot.ModDiscord, interaction.guild); if (!ModDiscord) return interaction.reply('配置加载错误,请检查角色配置'); const NoPerms = new Discord.MessageEmbed() .setTitle('权限不足!') .setDescription( `${supportbot.IncorrectPerms}\n\n所需角色: **Staff**` ) .setColor(supportbot.WarningColour); if (interaction.member.roles.cache.has(ModDiscord.id)) { // 获取用户输入的新频道名 const newChannelName = interaction.options.getString('channel'); if (!newChannelName) return interaction.reply({ content: `:x: 请输入要修改的频道名称`, ephemeral: true }); // 修改当前频道名称,等待接口执行完成 await interaction.channel.setName(newChannelName); const confirmEmbed = new Discord.MessageEmbed() .setColor('0x06F7C7') .setDescription( `:white_check_mark: ${interaction.user}, 已成功将当前频道名称修改为 **${newChannelName}**!` ); // 回复交互结果 interaction.reply({ embeds: [confirmEmbed] }); // 已删除原有的msg.delete()无效逻辑 } else { return interaction.reply({ embeds: [NoPerms] }); } }, });
注意:如果使用的discord.js版本为v14,需要将
MessageEmbed替换为EmbedBuilder,对应对象从discord.js包解构引入即可。
内容的提问来源于stack exchange,提问作者AleShito
相关产品推荐
相关产品推荐

