Я сделал setprefix с помощью js, и в нем есть ошибка

#javascript #node.js #discord.js

Вопрос:

У меня есть музыкальный бот discord, который имеет множество функций. Я сделал setprefix команду, которая сначала работала так идеально, а затем help произошла ошибка. Ошибка в том, что:

TypeError: Cannot read property 'name' of undefined

Я не уверен, что делать, может ли кто-нибудь мне помочь?

help.js :

 const { MessageEmbed } = require('discord.js')

module.exports = {
    info: {
        name: "help",
        description: "To show all commands",
        usage: "[command]",
        aliases: ["commands", "help me", "pls help"]
    },

    execute(client, message, args){
        var allcmds = "";

        client.commands.forEach(cmd => {
            let cmdinfo = cmd.info
            allcmds ="``" message.client.prefix cmdinfo.name " " cmdinfo.usage "`` ~ " cmdinfo.description "n"
        })

        let embed = new MessageEmbed()
        .setAuthor("Commands of " client.user.username, "https://raw.githubusercontent.com/SudhanPlayz/Discord-MusicBot/master/assets/Music.gif")
        .setColor("BLUE")
        .setDescription(allcmds)
        .setFooter(`To get info of each command you can do ${client.config.prefix}help [command] and my prefix is % | Hander by Lavaboy0192#2014`)

        if(!args[0])return message.channel.send(embed)
        else {
            let cmd = args[0]
            let command = client.commands.get(cmd)
            if(!command)command = client.commands.find(x => x.info.aliases.includes(cmd))
            if(!command)return message.channel.send("Unknown Command")
            let commandinfo = new MessageEmbed()
            .setTitle("Command: " command.info.name " info")
            .setColor("YELLOW")
            .setDescription(`
Name: ${command.info.name}
Description: ${command.info.description}
Usage: ``${client.config.prefix}${command.info.name} ${command.info.usage}``
Aliases: ${command.info.aliases.join(", ")}
`)
            message.channel.send(commandinfo)
        }
    }
} 
 

Команда setprefix:

 module.exports = {
    name: "setprefix",
    description: "Sets the prefix for the bot",
    argsNumber: 1,
    usage: "<prefix>",
    execute(message, args){
        const prefix = args.shift();
        message.client.prefixes.set(message.guild.id, prefix);
        message.reply(`Prefix set to ${prefix}`);
    }
}
 

Ответ №1:

Это потому info , что в вашем экспортируемом модуле нет свойства. Судя по экспорту в вашем help.js файле, ваши другие командные файлы экспортируют объект с двумя ключами; info и execute .

В execute вашем методе help.js вы повторяете client.commands и для каждой команды пытаетесь получить info свойство ( let cmdinfo = cmd.info ). Поскольку info для вашей команды нет опоры setprefix , cmdinfo она будет неопределенной. В следующей строке вы пытаетесь получить cmdinfo.name , cmdinfo.usage , и cmdinfo.description , но так как он не может прочитать свойство name , он выдает «Ошибка типа: не удается прочитать свойство «имя» неопределенного».

Попробуйте запустить фрагмент ниже, он выдаст ту же ошибку:

 let cmd = {
  name: 'setprefix',
  description: 'Sets the prefix for the bot',
  argsNumber: 1,
  usage: '<prefix>',
  execute: {},
};

let cmdinfo = cmd.info;

console.log(cmdinfo.name); 

Чтобы исправить это, вам нужно добавить новый info объект и переместить все, кроме execute него, как в следующем фрагменте. Попробуйте запустить его, вы увидите, что он печатает name правильно:

 let cmd = {
  info: {
    name: 'setprefix',
    description: 'Sets the prefix for the bot',
    argsNumber: 1,
    usage: '<prefix>',
  },
  execute: {},
};

let cmdinfo = cmd.info;

console.log(cmdinfo.name); 

Вам также необходимо добавить массив с ключом aliases , даже если его нет, так как ваш код выше тоже пытается их найти. Вот ваш окончательный код.

 module.exports = {
  info: {
    name: 'setprefix',
    description: 'Sets the prefix for the bot',
    argsNumber: 1,
    usage: '<prefix>',
    aliases: [],
  },
  execute(message, args) {
    const prefix = args.shift();
    message.client.prefixes.set(message.guild.id, prefix);
    message.reply(`Prefix set to ${prefix}`);
  },
};
 

Комментарии:

1. здесь какая-то ошибка TypeError: args.shift is not a function at Object.execute (/home/runner/Rayong/commands/setprefix.js:9:25)

2. Вы проверили, что args это такое? Вы пробовали записать, что это такое? Это массив? Вы передали его своей execute функции в главном файле? В другом файле это так execute(client, message, args){... . Передаете ли вы message в качестве второго аргумента каждый execute метод?

3. У меня есть маленькая штучка псевдонимы не работают

4. Я обновил свой код. Вам нужно добавить aliases массив в свой info , даже если это просто пустой массив.

Ответ №2:

module.exports размещен неправильно, module.exports должен быть в каталоге, из которого вы собираетесь экспортировать, если я правильно понял ваш код.

Пример:-

 answer.js:- module.exports = {
'value': {
    name: "setprefix",
    description: "Sets the prefix for the bot",
    argsNumber: 1,
    usage: "<prefix>",
    execute(message, args){
        const prefix = args.shift();
        message.client.prefixes.set(message.guild.id, prefix);
        message.reply(`Prefix set to ${prefix}`);
}
 
 index.js:- const answer = require(./answer)

message.channel.send("Name:- $(answer.name) n argsNumber:- $(answer.argsNumber)") //etc....
 

Если я ошибаюсь:-

1.Не могли бы вы также сказать, в каком каталоге находится ваша команда?

2.Можете ли вы сказать, почему вы сделали module.exports в этом каталоге?

3.Попытайтесь указать точную причину или линию ошибки.

пожалуйста, расскажите мне об этом в комментарии…