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

Discord.js频道重命名命令触发ReferenceError等报错求助

问题说明
  • 开发目标:基于discord.js编写Discord机器人频道重命名斜杠命令
  • 运行报错:
    • ReferenceError: msg is not defined
    • TypeError: 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:42:19