Discord.js v14音乐Bot报错:client.player.createQueue不是函数的解决办法
解决Discord.js v14音乐Bot中
client.player.createQueue is not a function报错 你遇到的这个报错根源是discord-player v6+版本重构了队列API,原有的createQueue和getQueue方法已被移除,替换为基于nodes的新接口。以下是具体修复步骤:
1. 确认discord-player版本
先执行命令检查当前版本:
npm list discord-player
若版本为v6.x及以上,必须使用新API适配。
2. 替换队列创建/获取逻辑
原错误代码:
const queue = await client.player.createQueue(interaction.guild)
修改为:
// 创建新队列(不存在则创建,存在则返回现有队列) const queue = await client.player.nodes.create(interaction.guild, { metadata: interaction, // 绑定交互元数据,方便后续调用 leaveOnEmpty: true, // 可选:队列空时自动离开语音频道 leaveOnEnd: true // 可选:所有曲目播放完毕后自动离开 })
若需获取已存在的队列,替换原getQueue逻辑:
// 原代码:client.player.getQueue(interaction.guild) const existingQueue = client.player.nodes.get(interaction.guildId)
3. 修正播放列表添加逻辑
你的代码中处理播放列表的部分存在逻辑错误:原代码将result.tracks[0]当作播放列表,实际上result.tracks是整个播放列表的曲目数组,需修改:
原错误代码:
const playlist = result.tracks[0] await queue.addTracks(playlist)
修改为:
await queue.addTracks(result.tracks) embed.setDescription(`Added **[${result.playlist.title}](${result.playlist.url})** (${result.tracks.length} tracks) to the queue.`) .setThumbnail(result.playlist.thumbnail) .setFooter({ text: `Total Duration: ${result.playlist.duration}` })
4. 完整修改后的核心代码片段
async execute({ client, interaction }) { if (!interaction.member.voice.channel) { await interaction.reply('You must be in a voice channel to use this command.') return } // 替换队列创建逻辑 const queue = await client.player.nodes.create(interaction.guild, { metadata: interaction }) if (!queue.connection) await queue.connect(interaction.member.voice.channel) const embed = new EmbedBuilder() if (interaction.options.getSubcommand() === 'song') { const url = interaction.options.getString('url') const result = await client.player.search(url, { requestedBy: interaction.user, searchEngine: QueryType.YOUTUBE_VIDEO, }) if (result.tracks.length === 0) { await interaction.reply('No results found...') return } const song = result.tracks[0] await queue.addTrack(song) embed .setDescription(`Added **[${song.title}](${song.url})** to the queue.`) .setThumbnail(song.thumbnail) .setFooter({ text: `Duration: ${song.duration}` }) } else if (interaction.options.getSubcommand() === 'playlist') { const url = interaction.options.getString('url') const result = await client.player.search(url, { requestedBy: interaction.user, searchEngine: QueryType.YOUTUBE_PLAYLIST, }) if (result.tracks.length === 0) { await interaction.reply('No playlist found...') return } // 修正播放列表添加逻辑 await queue.addTracks(result.tracks) embed .setDescription(`Added **[${result.playlist.title}](${result.playlist.url})** (${result.tracks.length} tracks) to the queue.`) .setThumbnail(result.playlist.thumbnail) .setFooter({ text: `Total Duration: ${result.playlist.duration}` }) } else if (interaction.options.getSubcommand() === 'search') { const url = interaction.options.getString('searchterms') const result = await client.player.search(url, { requestedBy: interaction.user, searchEngine: QueryType.AUTO, }) if (result.tracks.length === 0) { await interaction.reply('No results found...') return } const song = result.tracks[0] await queue.addTrack(song) embed .setDescription(`Added **[${song.title}](${song.url})** to the queue.`) .setThumbnail(song.thumbnail) .setFooter({ text: `Duration: ${song.duration}` }) } if (!queue.playing) await queue.play() await interaction.reply({ embeds: [embed], }) }
额外注意事项
- 确保Bot入口文件正确初始化discord-player:
const { Player } = require('discord-player') // 在client初始化后执行: client.player = new Player(client, { ytdlOptions: { quality: 'highestaudio', highWaterMark: 1 << 25 } })
- 若使用Spotify等其他音频源,需额外安装对应扩展包(如
@discord-player/extractor)并完成注册。
内容的提问来源于stack exchange,提问作者Neonz.dev
相关产品推荐
相关产品推荐

