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

Node.Js+Discord.Js开发音乐机器人进入语音频道出现TypoError如何解决

问题修复方案

核心错误点

  • 参数传递不匹配:play命令的execute方法定义接收(client, message, args)三个参数,但入口代码中调用时只传入了(message, args),缺少client参数,导致方法内部访问client相关属性直接报错。
  • 缺少语音相关权限意图:初始化Client时未添加GUILD_VOICE_STATES intent,Discord.js无法获取语音频道相关数据,所有语音操作都会失效。
  • 语音频道属性拼写错误:判断用户是否在语音频道的属性写错,正确应为message.member.voice.channel,不是message.member.channel。
  • 消息发送对象拼写错误:第二个判断中调用的message.channels.send多写了s,正确应为message.channel.send。
  • 缺少播放器初始化逻辑:代码中未看到discord-player的初始化挂载步骤,client.player未定义会直接抛出类型错误。
  • 事件名已废弃:Discord.js v13及以上版本已废弃message事件,需替换为messageCreate事件才能正常接收消息。

修正后代码

请先确保已安装依赖:npm install discord-player @discordjs/opus

play命令代码

module.exports = {
  name: 'play',
  aliases: ['p'],
  category: 'Music',
  utilisation: '{prefix}play [name/URL]',

  execute(client, message, args) {
      if (!message.member.voice.channel) return message.channel.send(`${client.emotes.error} - 你不在语音频道内!`);
      
      if (!args[0]) return message.channel.send(`${client.emotes.error} - 请指定要播放的音乐名称或链接!`);

      client.player.play(message, args.join(" "), { firstResult: true });
  },
};

入口初始化代码

const { Client, Intents } = require('discord.js');
const { Player } = require('discord-player');

// 补充语音相关权限意图
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_VOICE_STATES] });

// 初始化音乐播放器并挂载到client实例
client.player = new Player(client, {
  ytdlOptions: {
    quality: "highestaudio",
    highWaterMark: 1 << 25
  }
});

const prefix = '-';
const fs = require('fs');
const Discord = require('discord.js');

client.commands = new Discord.Collection();

const commandFiles = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
for(const file of commandFiles){
    const command = require(`./commands/${file}`);
    client.commands.set(command.name, command);
}

client.once('ready', () => { 
    console.log('Troubadour is online!');
});

// 替换废弃的message事件为messageCreate
client.on('messageCreate', message =>{
    if(!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();

    if(command === 'play'){
        // 补全传入的client参数
        client.commands.get('play').execute(client, message, args);
    }
    // 其余命令逻辑可在此处继续补充
});

// 替换为你自己的机器人Token
client.login('你的机器人Token');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:42:00