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

