如何解决discord.js代码中的TypeError: Cannot read property 'client' of undefined错误?
解决Discord.js中VoiceChannel实例化错误并获取语音频道成员
嗨,我来帮你搞定这个问题!你遇到的TypeError: Cannot read property 'client' of undefined错误,根源在于你手动创建了VoiceChannel实例,但Discord.js的VoiceChannel类需要依赖已有的服务器和客户端数据来初始化,不能直接用new Discord.VoiceChannel()创建空实例。
错误原因分析
当你执行let voice = new Discord.VoiceChannel()时,这个构造函数需要传入客户端和频道数据作为参数,你没传的话,内部就找不到guild.client,自然就抛出了这个错误。你真正需要做的是获取发送命令的用户当前所在的语音频道,而不是凭空创建一个频道对象。
修正后的代码
把你ladder命令的代码替换成下面这段:
client.on('message', function(msg){ if(msg.content[0] === '>'){ if(msg.content.slice(1)==='ladder'){ // 获取发送命令的用户所在的语音频道 const voiceChannel = msg.member.voice.channel; if(!voiceChannel){ // 用户不在任何语音频道里 msg.reply("你需要先加入一个语音频道才能使用这个命令哦!"); console.log("Error: 用户未加入语音频道"); } else{ // 获取语音频道的成员集合 const members = voiceChannel.members; // 将成员转换为用户名数组(方便输出) const memberNames = members.map(member => member.user.tag); console.log("当前语音频道成员:", memberNames); // 也可以把成员列表发送到文本频道 msg.channel.send(`当前语音频道成员列表:\n${memberNames.join('\n')}`); } } } });
关键知识点说明
msg.member.voice.channel:这个属性会返回发送消息的用户当前所在的语音频道,如果用户没在任何语音频道,就会返回undefined。voiceChannel.members:这是一个Collection对象,包含了该语音频道里的所有成员(包括机器人自己),你可以用map、forEach等方法来遍历处理。- 权限注意:确保你的机器人有查看语音频道和发送消息的权限,否则可能无法正常获取成员或发送回复。
额外提示
如果你使用的是Discord.js v13及以上版本,message事件已经被messageCreate替代,不过你的代码看起来是v12版本,所以上面的代码可以直接运行。如果之后升级版本,记得把client.on('message', ...)改成client.on('messageCreate', ...)。
内容的提问来源于stack exchange,提问作者floodnut
相关产品推荐
相关产品推荐

