Discord机器人报错TypeError: command.execute is not a function求助
解决Discord机器人
TypeError: command.execute is not a function报错 基础斜杠命令(如/ping)可正常运行,但执行moderation或play命令时触发以下报错:
TypeError: command.execute is not a function at Object.execute (C:\Users\shelby\Bot\src\events\interactionCreate.js:15:27) ...
核心问题分析
你的interactionCreate事件代码中,调用的是命令模块的execute方法,但play命令里定义的执行函数是run,函数名不匹配导致找不到对应方法。基础命令(如/ping)应该是用了execute作为函数名,所以能正常运行。
修复方案
方案一:统一命令函数名(推荐)
将play命令中的run函数名改为execute,并调整参数顺序与interactionCreate的调用逻辑一致:
修改后的play命令执行部分代码:
execute: async (interaction, client) => { // 修正语音频道判断逻辑:原条件写反 if (!interaction.member.voice.channel) return interaction.reply("Trebuie sa fii pe un voice channel pentru a folosi aceasta comanda!") const queue = await client.player.createQueue(interaction.guild) if (!queue.connection) await queue.connect(interaction.member.voice.channel) let embed = new MessageEmbed() if (interaction.options.getSubcommand() === "song"){ let url = interaction.options.getString("url") const result = await client.player.search(url, { requestedBy: interaction.user, searchEngine: QueryType.YOUTUBE_VIDEO }) if (result.tracks.length === 0) return interaction.reply("Niciun rezultat") const song = result.tracks[0] await queue.addTrack(song) embed .setDescription(`**[${song.title}](${song.url})** a fost adaugata`) .setFooter({ text: `Durata: ${song.duration}`}) } else if (interaction.options.getSubcommand() === "playlist"){ let url = interaction.options.getString("url") const result = await client.player.search(url, { requestedBy: interaction.user, searchEngine: QueryType.YOUTUBE_PLAYLIST }) if (result.tracks.length === 0) return interaction.reply("Niciun rezultat") const playlist = result.playlist // 修正:取result.playlist而非tracks await queue.addTracks(result.tracks) // 修正:用addTracks添加多曲目 embed .setDescription(`**${result.tracks.length} melodii din [${playlist.title}](${playlist.url})** a fost adaugata`) .setFooter({ text: `Durata: ${playlist.duration}`}) } else if (interaction.options.getSubcommand() === "search"){ let searchTerms = interaction.options.getString("searchterms") // 修正拼写错误:seatchterms → searchterms const result = await client.player.search(searchTerms, { requestedBy: interaction.user, searchEngine: QueryType.AUTO }) if (result.tracks.length === 0) return interaction.reply("Niciun rezultat") const song = result.tracks[0] await queue.addTrack(song) embed .setDescription(`**[${song.title}](${song.url})** a fost adaugata`) .setFooter({ text: `Durata: ${song.duration}`}) } if (!queue.playing) await queue.play() await interaction.reply({ embeds: [embed] }) }
方案二:修改事件调用逻辑
若不想修改命令函数名,可调整interactionCreate中的调用代码,匹配play命令的解构参数:
// 将原execute调用替换为 await command.run({ interaction, client });
额外修正点
除核心问题外,play命令还有几处逻辑/拼写错误:
- 语音频道判断条件写反,导致用户在频道内时反而报错
- playlist处理时错误将
result.tracks赋值给playlist,应取result.playlist - 添加多曲目需用
queue.addTracks()而非queue.addTrack() - 搜索关键词参数拼写错误:
seatchterms→searchterms - 初始未调用
interaction.reply()就直接editReply(),会触发额外报错
内容的提问来源于stack exchange,提问作者Shelby
相关产品推荐
相关产品推荐

