You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:30:16