【问题标题】:I am getting an error Typerror Cannot read property 'execute' of undefined我收到错误类型错误无法读取未定义的属性“执行”
【发布时间】:2021-02-12 21:36:39
【问题描述】:

我的主要代码我正在尝试制作一个不和谐的机器人我收到此错误 Typerror Cannot read property of 'execute' undefined 我几乎拥有所有解决方案,但如果有人解决了它仍然有一些错误,将不胜感激。我正在尝试制作一个简单的 discor 机器人,但代码不仅可以工作,请帮忙。


const client = new Discord.Client();

const prefix = '-';

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.once('ready', () => {
    console.log('yes its online');
});


client.on('message', message =>{
    if(!message.content.startsWith(prefix) || message.author.bot) return;

    const args = message.content.slice(prefix.length).split(/ +/);
    const command = args.shift().toLowerCase();


 client.on('guildMemberAdd', member =>{
       const channel = member.guild.channels.cache.find(channel=> channel.name === "hlo");
       if(!channel) return;

       channel.send(`Welcome to our server , ${member}, please read the rules!`);

    });
    

    if(command === 'ping'){
        message.channel.send('pong!');
    }
    if (command == 'kick'){
       client.commands.get('kick').execute(message, args);
    }
    if (command === 'ban'){
        client.commands.get('ban').execute(message, args);
        }
    
}); ```

My ban code 
```module.exports = {
    name: 'ban',
    description: "Uses ban hammer",
    execute(messsage, args){

    
     if (command === "ban"){
        const userBan = message.mentions.users.first();

        if(userBan){
            var member = message.guild.member(userBan);

            if(member) {
                member.ban({
                    reason: 'you broke rules buddy.'
                }).then(() => {
                    message.reply(`${userBan.tag} was banned from the server.`)
                })

            } else{
                message.reply('that user is not in the server.');
            }
        }else {
            message.reply('you need to state a user to ban')
        }
}
}

我的踢码

module.exports = {
    name: 'kick',
    description: 'kick people',
    execute(messsage, args){

    
     if (command === "kick"){
        const userKick = message.mentions.users.first();

        if(userBan){
            var member = message.guild.member(userKick);

            if(member) {
                member.kick({
                    reason: 'you broke rules buddy.'
                }).then(() => {
                    message.reply(`${userKick.tag} was kicked from the server.`)
                })

            } else{
                message.reply('that user is not in the server.');
            }
        }else {
            message.reply('you need to state a user to kick')
        }
}
}```

【问题讨论】:

  • 您的代码在我看来相当混乱。 guildMemberAdd 事件似乎在 message 事件内?如果你能说明你做了什么来得到这个错误,或者只是发布完整的错误日志,这也会很有帮助。
  • const commandFiles = fs.readdirSync('./commands/').filter... 运行后 commandFiles 的值是多少?看起来集合中不存在 client.commands.get('kick')

标签: javascript node.js discord.js


【解决方案1】:

要完成这项工作,您需要做两件事。

首先,您需要将您的 on('guildMemberAdd') 与您的 on('message') 事件分开。现在他们被搞砸了,这是行不通的。

所以你的索引文件应该是

// your command reader above this
client.once('ready', () => {
    console.log('yes its online');
});

client.on('guildMemberAdd', member => {
    // your code
}

client.on('message', message => {
    // here we will work in part two
}

其次,让我们看看您的命令阅读器。你的那部分代码对我来说看起来不错。确保您的 commands 文件夹与您的 index 文件位于同一目录中。这就是我认为您的问题所在。

注意:我在这里说“索引文件”。我的意思是你有client.login() 函数的文件。它可能是bot.js 或类似的东西。

你的文件夹结构应该是这样的

-- Your bot folder
    - index.js
    - package.json
    - package-lock.json
    -- commands (this is a folder)
        - kick.js
        - ban.js

注意:只是为了确保,这里有一个命令阅读器,它完全适用于上述文件结构。

// Read all files in the commands folder and that ends in .js
const commands = fs.readdirSync('./commands/').filter(file => file.endsWith('.js'));
// Loop over the commands, and add all of them to a collection
// If there's no name found, prevent it from returning an error
for (let file of commands) {
    const command = require(`./commands/${file}`);
    // Check if the command has both a name and a description
    if (command.name && command.description) {
        client.commands.set(command.name, command);
    } else {
        console.log("A file is missing something");
        continue;
    }
    
    // check if there is an alias and if that alias is an array
    if (command.aliases && Array.isArray(command.aliases))
        command.aliases.forEach(alias => client.aliases.set(alias, command.name));
};

client.on('message' 事件中的命令处理程序对我有用。 所以我假设您对文件夹结构有疑问。

话虽如此,我还是建议您使用稍微不同的方式来处理您的命令。目前您需要手动将命令添加到您的if 链中。那不是很有效。

理想情况下,您希望自动执行此操作。你已经有了你的论点和你的命令词。您现在需要做的就是检查该命令是否存在,如果存在,则执行它。

// check if there is a message after the prefix
if (command.length === 0) return;
// look for the specified command in the collection of commands
let cmd = client.commands.get(command);
// if there is no command we return with an error message
if (!cmd) return message.reply(`\`${prefix + command}\` doesn't exist!`);
// finally run the command
cmd.execute(message, args);

您的client.on('message' 事件现在应该看起来像这样。

client.on('message', message => {
    // check if the author is a bot
    if (message.author.bot) return;
    // check if the message comes through a DM
    if (message.guild === null) return;
    // check if the message starts with the 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 command = args.shift().toLowerCase();
    // check if there is a message after the prefix
    if (command.length === 0) return;
    // look for the specified command in the collection of commands
    let cmd = client.commands.get(command);
    // if there is no command we return with an error message
    if (!cmd) return message.reply(`\`${prefix + command}\` doesn't exist!`);
    // finally run the command
    cmd.execute(message, args);
});

注意:我还注意到您的命令中有一些不一致之处。但我认为,一旦你真正掌握了这些命令,你就能自己弄清楚这一点 ?

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2021-02-16
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多