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

编写Discord语音频道移动指令时报setChannel未定义错误如何解决?

问题原因&修复方案

错误触发原因

  • 获取对象类型错误:message.mentions.users.first()返回的是全局User实例,没有voice相关属性,必须使用message.mentions.members.first()获取当前服务器的GuildMember成员实例。
  • 属性&方法版本不兼容:discord.js v12及以上版本,获取成员当前语音频道的属性已从voiceChannel改为voice.channel;v13及以上版本,移动语音频道的方法从setChannel更名为setVoiceChannel。
  • 变量引用错误:调用setChannel时给channel1加了单引号,相当于传入了字符串'channel1'而非你提前定义的频道变量。
  • 同步调用逻辑无效:三次setChannel同步执行会被接口合并,最终只会执行最后一次操作,需要增加异步延时才能实现来回移动的效果。
  • 缺少空值校验:未判断目标用户是否在语音频道内,直接调用方法会触发额外的空指针报错。

修复后代码

module.exports ={
    name:'bully',
    description: "在语音频道间来回移动提及的用户",
    async execute(message, args, Discord, client){
       // 取服务器内成员实例,而非全局用户实例
       const targetMember = message.mentions.members.first();
       // 异常情况拦截
       if(!targetMember) return message.reply("未提及目标用户");
       if(!targetMember.voice.channel) return message.reply("目标用户当前未加入任何语音频道");
       
       const channel1 = targetMember.voice.channel;
       const channel2 = '785599712677462016';
       // 异步延时实现来回移动效果,延时时长可自行调整
       await targetMember.voice.setChannel(channel1);
       await new Promise(resolve => setTimeout(resolve, 600));
       await targetMember.voice.setChannel(channel2);
       await new Promise(resolve => setTimeout(resolve, 600));
       await targetMember.voice.setChannel(channel1);
    }
}

额外注意事项

  • 若使用discord.js v13及以上版本,将代码中所有.setChannel替换为.setVoiceChannel即可。
  • 需确保机器人拥有移动成员的服务器权限,且目标用户所在的语音频道对机器人开放移动权限。

内容的提问来源于stack exchange,提问作者Gio23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:36:04