Node.Js+Discord.Js开发音乐机器人进入语音频道出现TypoError如何解决
问题修复方案
核心错误点
- 参数传递不匹配:
play命令的execute方法定义接收(client, message, args)三个参数,但入口代码中调用时只传入了(message, args),缺少client参数,导致方法内部访问client相关属性直接报错。 - 缺少语音相关权限意图:初始化Client时未添加
GUILD_VOICE_STATESintent,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
相关产品推荐
相关产品推荐

