TypeError: command.execute 在捕获错误时不是函数。此外,冷却不起作用。在 Discord.js 上

Posted

技术标签:

【中文标题】TypeError: command.execute 在捕获错误时不是函数。此外,冷却不起作用。在 Discord.js 上【英文标题】:TypeError: command.execute is not a function when catching an error. Also, cooldown doesn't work. On Discord.js 【发布时间】:2021-12-29 01:39:49 【问题描述】:

我已经在 Discord 机器人上工作了一段时间,也实施了一段时间的冷却命令。它永远不会起作用,今天我决定尝试修复它。

起初,它一直向我发送一条错误消息,说 TypeError: command.execute is not a function 和频道上的一条错误消息,所以我只是删除了 catch (err),所以它不会发送那个烦人的消息。但是,当然,这样做可能相当于移除了被划伤的肢体。

现在越来越多的人使用我的机器人,我试图重新设计冷却功能,它位于../events/guild/message.js,它是这样的:

require('dotenv').config();
const Discord = require('discord.js');
const cooldowns = new Map();

module.exports = async (Discord, client, message) => 
    if (message.author.bot) return;
  
    const prefix = message.content.includes("nabe ") ? "nabe " : "n!"
  
    if (message.content.indexOf(prefix) !== 0) return;
  
    const args = message.content.slice(prefix.length).trim().split(/ +/g);
    const command = args.shift().toLowerCase();
  
    const cmd = client.commands.get(command) || client.commands.find(a => a.aliases && a.aliases.includes(cmd));
  
    if(message.channel.type === "dm")return message.channel.send("you can't use commands on dm")
  
    if(cmd)
      cmd.execute(client, message, args, Discord);
    else return

    if(!cooldowns.has(command.name))
        cooldowns.set(command.name, new Discord.Collection());
    

    const current_time = Date.now();
    const time_stamps = cooldowns.get(command.name);
    const cooldown_amount = (command.cooldown) * 1000;

    
    if(time_stamps.has(message.author.id))
        const expiration_time = time_stamps.get(message.author.id) + cooldown_amount;

        if(current_time < expiration_time)
            const time_left = (expiration_time - current_time) / 1000;

            return message.reply(`wait **$time_left.toFixed(1)** more seconds to do $command.name again.`).then(msg =>  msg.delete( timeout: 7000 ) );
        
    

    
    time_stamps.set(message.author.id, current_time);
    
    setTimeout(() => time_stamps.delete(message.author.id), cooldown_amount);
    
    try
        command.execute(message, args, cmd, client, Discord);
     catch (err)
        message.reply("There was an error trying to execute this command.");
        console.log(err);
    

它是如何在每个命令文件上实现的:

module.exports = 
    info: 
        name: "command name",
        description: "command description",
        cooldown: 30,
    ,
    async execute(client, message, args, Discord) 
              /*code here*/

顺便说一句,我从 youtube 上的 CodeLyon 获得了大部分代码,here's the sourcebin.

每次我执行命令时,它都会在通道上返回TypeError: command.execute is not a function 错误和错误消息。我知道有些人说command.execute 不存在,但它适用于教程视频,我不知道任何替代方案。而且它可能甚至无法修复冷却时间。

如果有人能找到解决方案,我将非常感激。

NodeJS 16.13.0、NPM 8.1.0、DiscordJS 12.5.3、Heroku 服务器。

【问题讨论】:

【参考方案1】:

我知道有人说command.execute不存在

他们是对的。正如您在定义的命令中看到的那样:

module.exports = 
    info: 
        name: "command name",
        description: "command description",
        cooldown: 30,
    ,

您似乎没有在命令正文中指定execute 函数。如果你想运行命令,你需要这样做:

module.exports = 
    info: 
        name: "command name",
        description: "command description",
        cooldown: 30,
        execute: (client, message, args, Discord) => 
            // command logic goes here
        
    ,

P.S 我相信您链接的 sourcebin 教程还包含一个 execute 函数:

【讨论】:

实际上,我在每个命令文件中都有一个执行。我没有把它放在这个问题上,我的错。 async execute(client, message, args, Discord) 否则,如果我没有在命令文件上执行,这些命令将无法正常工作。 @dimactavish 提问时请提供完整的详细信息。 我已经编辑了这个问题。它现在应该有足够的细节,对吧?我不是说“更多人使用我的机器人”吗?如果它一开始根本不起作用,为什么有人能够使用它。 @dimactavish 您的问题与您的代码的语法错误有关,恰好由您提供的不完整图片补充。因此,我得出一个结论,那就是你遇到的问题。我也不知道您的机器人中包含哪些功能。你说'人们使用我的机器人',但除了命令之外还有什么方式?而且我也不知道你的代码库是如何构成的。 我的代码结构类似于我第一次看到的教程中的代码,即 CodeLyon 的。除了命令之外,其他人甚至可以将我的机器人用于什么用途?除了冷却时间和command.execute 的最后一部分外,一切都很好。

以上是关于TypeError: command.execute 在捕获错误时不是函数。此外,冷却不起作用。在 Discord.js 上的主要内容,如果未能解决你的问题,请参考以下文章

反应本机获取多标记[未处理的承诺拒绝:TypeError:TypeError:未定义不是对象(评估'this.state.markers.map

Django TypeError - TypeError: issubclass() arg 1 必须是一个类

pyspark:TypeError:'float'对象不可迭代

Python 3.8 TypeError: can't concat str to bytes - TypeError: a bytes-like object is required, not 's

TypeError: key 必须是一个字符串,一个缓冲区或一个对象在 typeError 与 GCP 文件存在

TypeError: jQueryxxxxxx 不是函数