为什么我开发的discord.js音乐播放play命令持续报错?
代码错误点及修正方案
你提交的代码存在以下几处可直接导致运行报错的问题:
- 导出语法错误:
module.export应为module.exports,末尾缺失的s会导致命令文件无法被正常加载识别 - 异步语法错误:
execute函数内部使用了await关键字,但函数本身没有标记为异步,需改为async execute(message, args) - 废弃属性调用:如果使用的是discord.js v12及以上版本,
message.member.voiceChannel已经被官方废弃,需替换为message.member.voice.channel - 搜索逻辑错误:视频搜索结果判断逻辑写为
videoResult.videos.length > 1,会导致仅返回1条匹配结果时直接输出null,需改为videoResult.videos.length >= 1
修正后完整代码
const ytdl = require("ytdl-core"); const ytSearch = require("yt-search"); 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 connection = await voiceChannel.join(); const videoFinder = async (query) => { const videoResult = await ytSearch(query); return videoResult.videos.length >= 1 ? videoResult.videos[0] : null; }; const video = await videoFinder(args.join(" ")); if (video) { const stream = ytdl(video.url, { filter: "audioonly" }); const dispatcher = connection.play(stream, { seek: 0, volume: 1 }); // 播放结束后自动离开频道 dispatcher.on("finish", () => { voiceChannel.leave(); }); await message.reply(`现在正在播放:*${video.title}*`) } else { await message.channel.send("没有找到匹配的视频内容") } }, };
额外注意事项
- 使用前请确保已经安装全部依赖:
ytdl-core、yt-search、@discordjs/opus(语音编码必须依赖) - 若使用discord.js v14及以上版本,语音相关功能需额外安装
@discordjs/voice组件,原有语音接口已全部重构
内容的提问来源于stack exchange,提问作者user16078802
相关产品推荐
相关产品推荐

