#javascript #node.js #discord #discord.js #typeerror
#javascript #node.js #Discord #discord.js #ошибка типа
Вопрос:
Я работаю над ботом JavaScript Discord (v12.4.0) и пытаюсь создать команду channelinfo, но у меня ошибка при определении и поиске свойств message.channel.
Это channelinfo.js
const { MessageEmbed } = require("discord.js")
module.exports = {
name: "channelinfo",
cooldown: 5,
aliases: ["ci", "infochannel"],
description: "Displays info about a channel!",
guildOnly: true,
execute(client, message, args) {
const Discord = require("discord.js")
//Definimos discord.
// const channel = message.mentions.channels.first() || message.guild.channels.cache.find(x => x.id == args[0])
//Definimos el canal del cual sacaremos informacion. Obteniendo el primer canal mencionado o la primera id.
//if (!channel) return message.reply("You must enter a channel!")
//Si no menciono un canal o no puso una id, retorna.
//Definimos el embed que enviaremos
const cha = new Discord.MessageEmbed()
.addField(`Name:`, `- ${Discord.Util.escapeMarkdown(message.channel.name)}`)
//Obtenemos el nombre del canal.
.addField(`Mention:`, `- `${message.channel}``)
//Un simple ejemplo de como se menciona este.
.addField(`ID:`, `- ${message.channel.id}`)
//Se obtiene la id del canal.
.addField(`Type`, `- ${message.channel.type}`)
//Obtenemos el tipo de canal, noticias, texto, voz etc
.addField(`Is it nsfw?`, `${message.channel.nsfw}`)
//Revisamos si el canal es nswf, mediante un boolean (false | true)
.addField(`Topic:`, `- ${message.channel.topic.toString().length < 1 ? "There's no topic" : message.channel.topic}`)
//Se obtiene el tema del canal, si el contenido es menor a 1 caracter (Se hace esto por que a veces se buguean los temas) retorne a "No hay un tema."
//Si hay un tema, lo envia.
.addField(`Category:`, `- ${message.channel.parent.name}`)
//Obtenemos la categoria en el que esta el canal.
.setColor("RANDOM") //Color(?
message.channel.send(cha)
}}
И это ошибка журнала консоли
2020-10-26T13:29:59.413677 00:00 app[worker.1]: TypeError: Cannot read property 'channel' of undefined
2020-10-26T13:29:59.413677 00:00 app[worker.1]: at Object.execute (/app/commands/channelinfo.js:26:72)
Сначала я попытался добавить const, который получит канал с упоминанием или с идентификатором. Код был таким:
const channel = message.mentions.channels.first() || message.guild.channels.cache.get(args[0]) || message.channel;
Поскольку это не сработало, я попытался определить канал только как message.channel (const channel = message.channel), но у меня была та же ошибка.
Затем я стер строку const и использовал message.channel
вместо channel
файлов для встраивания, но я все равно получаю ту же ошибку.
Я уверен, что это не ошибка, вызванная обработчиком команд, потому что все остальные команды работают нормально.
Любопытство: я попытался выполнить аналогичную команду, но отобразить информацию о роли, и ошибка была той же (TypeError: не удается прочитать свойство ‘roles’ undefined)
Вот bot.js
// require fs para el command handler
const fs = require('fs');
// require the discord.js module
const Discord = require('discord.js');
const { token, prefix, yt_api_key } = require('./config.json');
// create a new Discord client
const client = new Discord.Client();
fs.readdir("./events/", (err, files) => {
if (err) return console.error(err);
files.forEach(file => {
const event = require(`./events/${file}`);
let eventName = file.split(".")[0];
client.on(eventName, event.bind(null, client));
});
});
client.noprefixcommands = new Discord.Collection();
fs.readdir("./noprefixcommands/", (err, files) => {
if (err) return console.error(err);
files.forEach(file => {
if (!file.endsWith(".js")) return;
let props = require(`./noprefixcommands/${file}`);
let noprefixcommandName = file.split(".")[0];
client.noprefixcommands.set(noprefixcommandName, props);
});
});
client.commands = new Discord.Collection();
const cooldowns = 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', message => {
if (!message.content.startsWith(prefix) || message.author.bot) return;
const args = message.content.slice(prefix.length).trim().split(/ /);
const commandName = args.shift().toLowerCase();
const command = client.commands.get(commandName)
|| client.commands.find(cmd => cmd.aliases amp;amp; cmd.aliases.includes(commandName));
if (!command) return;
if (command.guildOnly amp;amp; message.channel.type === 'dm') {
return message.reply('I can't execute that command inside DMs!');
}
if (command.args amp;amp; !args.length) {
let reply = `You didn't provide any arguments, ${message.author}!`;
if (command.usage) {
reply = `nThe proper usage would be: `${prefix}${command.name} ${command.usage}``;
}
return message.channel.send(reply);
}
if (!cooldowns.has(command.name)) {
cooldowns.set(command.name, new Discord.Collection());
}
const now = Date.now();
const timestamps = cooldowns.get(command.name);
const cooldownAmount = (command.cooldown || 3) * 1000;
if (timestamps.has(message.author.id)) {
const expirationTime = timestamps.get(message.author.id) cooldownAmount;
if (now < expirationTime) {
const timeLeft = (expirationTime - now) / 1000;
return message.reply(`please wait ${timeLeft.toFixed(1)} more second(s) before using the `${command.name}` command.`);
}
}
timestamps.set(message.author.id, now);
setTimeout(() => timestamps.delete(message.author.id), cooldownAmount);
try {
command.execute(message, args);
} catch (error) {
console.error(error);
message.reply('there was an error trying to execute that command!');
}
});
client.login(process.env.BOT_TOKEN);
Я использую Github для редактирования кода и Heroku для размещения.
У меня возникла эта проблема, когда я начал создавать команду в Glitch, но я вернулся на Github, и проблема была похожа на сбой.
Пожалуйста, кто-нибудь, помогите, я был бы очень благодарен
Комментарии:
1. Ошибка означает, что у вас где-то есть
someObject.users
в вашем коде, иsomeObject
она не определена. Однако в вашем вопросе отсутствует соответствующая строка.2. @ChrisG Поэтому я должен добавить bot.js файл
3. Ошибка содержит номер файла и строки, в которых она возникает. Однако, похоже, это не соответствует файлу кода / скрипта в вашем вопросе.
4. Я предполагаю, что это потому, что подпись функции есть
execute(client, message, args)
, но вы вызываете ее какcommand.execute(message, args);
. Имя не имеет значения, важен только порядок параметров.5. Спасибо! Я удалил
client
его изcommand.execute(<>)
, и теперь он работает. Действительно спасибо, чувак