#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.Попытайтесь указать точную причину или линию ошибки.
пожалуйста, расскажите мне об этом в комментарии…