JavaScript开发Discord音乐机器人可加入频道但无法播放音乐如何解决
问题修复方案
现有代码的核心错误点
- 变量名大小写错误:导入的搜索包变量名为
ytsearch,实际调用时写的是ytSearch,大小写不匹配会直接抛出未定义错误,代码直接终止运行 - 语法结构错误:
videoFinder异步函数定义后未加闭合大括号,且const video = await videoFinder(args.join(' '))写在了videoFinder的return语句之后,属于永远不会执行的死代码,根本拿不到搜索到的视频结果 - 搜索逻辑错误:
videoFinder返回判断写的是videoResult.videos.length > 1,也就是说搜索结果只有1条匹配时会返回null,大部分情况下都拿不到可用的视频结果 - 逻辑遗漏:你定义了用于播放的
play异步函数,但全程没有调用该函数,播放逻辑自然不会触发 - 资源识别问题:使用
ytdl生成的音频流传入createAudioResource时未指定流类型,@discordjs/voice可能无法正确识别音频输入 - 提示文案错误:权限判断部分的提示写反了主体,CONNECT、SPEAK是机器人需要的权限,不是调用指令的用户需要的权限,提示文案表述错误
修复后可运行代码
const ytdl = require('ytdl-core'); const ytsearch = require('yt-search'); const { joinVoiceChannel, createAudioPlayer, createAudioResource, StreamType } = require('@discordjs/voice'); module.exports = { name:'play', description: '加入语音频道并播放YouTube视频音频', async execute(message, args) { const voiceChannel = message.member.voice.channel; if (!voiceChannel) return message.channel.send('你需要加入一个语音频道才能使用播放指令'); const permissions = voiceChannel.permissionsFor(message.client.user); if (!permissions.has('CONNECT')) return message.channel.send('机器人没有加入该语音频道的权限'); if (!permissions.has('SPEAK')) return message.channel.send('机器人没有在该语音频道发言的权限'); if (!args.length) return message.channel.send('请指定要播放的内容关键词或链接'); // 视频搜索函数 const videoFinder = async (query) => { const videoResult = await ytsearch(query); return videoResult.videos.length > 0 ? videoResult.videos[0] : null; } const video = await videoFinder(args.join(' ')); if (!video) return message.channel.send('未找到匹配的视频内容'); const stream = ytdl(video.url, { filter: "audioonly" }); const connection = joinVoiceChannel({ channelId: voiceChannel.id, guildId: message.guild.id, adapterCreator: message.guild.voiceAdapterCreator, }); const player = createAudioPlayer(); const resource = createAudioResource(stream, { inputType: StreamType.Arbitrary }); player.play(resource); connection.subscribe(player); // 可选:添加播放错误监听便于排查问题 player.on('error', error => { console.error('播放出错:', error); message.channel.send('播放过程中出现错误,请稍后重试'); }); } }
内容的提问来源于stack exchange,提问作者bakbak1310
相关产品推荐
相关产品推荐

