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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:39:03