Discord.js音乐机器人报channel_info.channelId.join is not a function如何解决
问题定位
错误channel_info.channelId.join is not a function的直接原因是你调用了字符串类型的join方法:
channel_info是用户的语音状态对象,channel_info.channelId存储的是用户所在语音频道的ID字符串,本身没有任何操作方法- 你需要拿到的是语音频道对象而非ID字符串,只有频道对象才有操作相关的方法
同时你当前的代码还存在网关意图不全、API版本不匹配的问题,discord.js v13及以上版本已经将语音功能从主库拆分,旧版语音相关API已经废弃。
修复步骤
1. 安装必要依赖
先安装拆分后的语音工具库和基础依赖:
npm install @discordjs/voice opusscript ytdl-core
2. 调整基础配置与意图
补充语音功能必须的网关意图,否则无法正常读取用户语音状态:
const Discord = require('discord.js'); // 引入新语音工具包 const { joinVoiceChannel, createAudioPlayer, createAudioResource, entersState, VoiceConnectionStatus, AudioPlayerStatus } = require('@discordjs/voice'); const bot = new Discord.Client({ intents: [ "Guilds", "GuildMessages", "GuildVoiceStates", // 语音状态获取必须的意图 "MessageContent" // v14及以上版本读取消息内容必须的意图 ] }); const ytdl = require('ytdl-core'); const botToken = 'mytoken';
3. 重写消息监听逻辑
旧版message事件已更名为messageCreate,同时替换为新版语音播放逻辑:
bot.on('ready', () => { console.log('机器人已上线'); }); bot.on('messageCreate', async msg => { if (msg.author.bot) return; if (msg.content.toLowerCase().startsWith(';p')) { // 直接获取发送者的语音状态 const memberVoiceState = msg.member.voice; // 判断用户是否在语音频道 if (!memberVoiceState.channel) { return console.log('Canal não encontrado!'); } const targetVoiceChannel = memberVoiceState.channel; console.log('Canal encontrado'); try { // 加入目标语音频道 const connection = joinVoiceChannel({ channelId: targetVoiceChannel.id, guildId: targetVoiceChannel.guild.id, adapterCreator: targetVoiceChannel.guild.voiceAdapterCreator, }); // 等待连接建立完成 await entersState(connection, VoiceConnectionStatus.Ready, 30000); // 创建音频流与播放器 const stream = ytdl('https://www.youtube.com/watch?v=BxmMGnvvDCo', { filter: 'audioonly' }); const audioResource = createAudioResource(stream); const audioPlayer = createAudioPlayer(); // 绑定播放关系 audioPlayer.play(audioResource); connection.subscribe(audioPlayer); // 播放结束自动离开频道 audioPlayer.on(AudioPlayerStatus.Idle, () => { connection.destroy(); }); audioPlayer.on('error', console.error); } catch (err) { console.error('操作失败:', err); } } }); bot.login(botToken);
额外检查项
- 前往Discord开发者后台,在机器人设置页开启
Message Content Intent权限(v14及以上版本必须) - 确认机器人拥有目标语音频道的「连接」「说话」权限
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

