TypeError:尝试执行命令文件时,无法读取未定义“ execute”的属性

时间:2020-10-10 03:24:27

标签: javascript node.js discord discord.js

我正在用一个简单的命令处理程序制作一个不和谐的机器人。我以前从未使用过命令处理程序,因此我对这类功能和类似的东西并不了解很多。我收到一条错误消息,指出execute是未定义的,我不知道如何解决。代码:

module.exports = {Discord : 'Discord.JS'}
module.exports = {client : 'Discord.Client'}

const fs = require('fs');
client.commands = new Discord.Collection();

const commandFiles = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
for(const file of commandFiles) {
    const command = require(`./commands/${file}`);

    client.commands.set(command.name, command);
};

client.on('message', msg => {
    let message = '';
    if (msg.channel === msg.author.dmChannel) {
        return
    } else {
            client.commands.get('./commands/allyApplication').execute(message, msg);
    };

    if (msg.content.toLowerCase().startsWith('!accept')) {
        client.commands.get('./commands/acceptAlly').execute(message, msg);
    };

    if (msg.content.toLowerCase().startsWith('!decline')) {
        client.commands.get('./commands/declineAlly').execute(message, msg);
    };

});

这是读取此内容的脚本的代码:

module.exports = {
    name: 'declineAlly',
    description: 'Declines allies.',
    execute(message, msg) {
    REST OF CODE
    }
} 

如果有人知道我如何解决该错误,那将是很棒的,因为我是命令处理程序的新手。

1 个答案:

答案 0 :(得分:0)

要回答您的问题,您的代码无效,因为您需要像这样client.commands.get('declineAlly').execute(message, msg);来调用它,并且由于client.commands.get('./commands/allyApplication').execute(message, msg);总是运行else,这意味着您的代码代码甚至还没有达到定义命令的地步。此外,您总是将空字符串传递给命令。您在这里所做的事情本身并没有错,那就是您必须手动将每个命令添加到处理程序中。那不是很有效。

所以让我们解决这个问题。

让我们从顶部开始。将命令设置到集合中的代码可以正常工作。因此,让我们开始探讨问题的根源client.on('message', message。在以下代码段中,我始终使用message而不是msg

开始时,您应该做两件事。首先检查该频道是否为DM,如果是则返回。

if (message.guild === null) {
    return message.reply("Hey there, no reason to DM me anything. I won't answer anyway :wink:"); //example sentence
}

并检查发送此消息的用户是否是机器人。这样其他机器人就无法使用您的机器人。

if (message.author.bot) return;

接下来应该做的是设置一个前缀值(在您的情况下为!,并检查消息是否以所述前缀开头。

const prefix = '!';
if (!message.content.startsWith(prefix)) {
    return;
}

现在,我们已经检查了消息是否实际上是一条命令,我们可以切掉前缀并将消息的其余部分转换成我们称为args的数组。

const args = message.content.slice(prefix.length).trim().split(/ +/g);

接下来,我们需要获取该数组的第一个元素,将其删除并将其存储为命令值。我们还将其转换为小写。

const cmd = args.shift().toLowerCase();

接下来,我们需要检查消息是否确实包含一些参数。这很重要,因此,如果消息只是简单的!,则此代码的其余部分将不会执行。

if (cmd.length === 0) return;

之后,该从我们的命令集中获取命令了。

let command = client.commands.get(cmd);

完成后,我们需要检查命令是否确实存在。如果没有,则返回错误。

if (!command) return message.reply(`\`${prefix + cmd}\` doesn't exist!`);

一旦我们确认该命令存在,就该执行该命令了。

command.execute(message, args);

就在那里。命令处理程序完成。我们还没有完成。在使用这些命令之前,我们需要在此处进行一些更改。

  • 首先,从这一点开始,您将使用命令名称而不是代码中的其他名称来调用命令。
  • 第二,您需要确保命令名称完全小写。那是因为我们在处理程序中将命令转换为小写字母。

最后,我们应该稍微更改一下命令,以便于阅读。

module.exports = {
    name: 'declineally',
    description: 'Declines allies.',
    execute: (message, msg) => {
        // the rest of your code
    }
} 

所有这些之后,您的client.on('message'事件应该看起来像这样:

client.on('message', message => {
    // check if the message comes through a DM
    if (message.guild === null) {
        return message.reply("Hey there, no reason to DM me anything. I won't answer anyway :wink:");
    }
    // check if the author is a bot
    if (message.author.bot) return;
    
    // set a prefix and check if the message starts with it
    const prefix = "!";
    if (!message.content.startsWith(prefix)) {
        return;
    }

    // slice off the prefix and convert the rest of the message into an array
    const args = message.content.slice(prefix.length).trim().split(/ +/g);
    
    // convert all arguments to lowercase
    const cmd = args.shift().toLowerCase();

    // check if there is a message after the prefix
    if (cmd.length === 0) return;

    // look for the specified command in the collection of commands
    let command = client.commands.get(cmd);

    // if there is no command we return with an error message
    if (!command) return message.reply(`\`${prefix + cmd}\` doesn't exist!`);

    // finally run the command
    command.execute(message, args);

});