#javascript #discord.js
#javascript #discord.js
Вопрос:
Я делаю discord.js мы с ботом ввели в него команду таблицы лидеров.
const Discord = require("discord.js");
// Get a filtered list (for this guild only), and convert to an array while we're at it.
const filtered = client.points.filter( p => p.guild === message.guild.id ).array();
// Sort it to get the top results... well... at the top. Y'know.
const sorted = filtered.sort((a, b) => b.points - a.points);
// Slice it, dice it, get the top 10 of it!
const top10 = sorted.splice(0, 10);
// Now shake it and show it! (as a nice embed, too!)
const embed = new Discord.RichEmbed()
.setTitle("Leaderboard")
.setAuthor(client.user.username, client.user.avatarURL)
.setDescription("Our top 10 points leaders!")
.setColor(0xff0000);
for(const data of top10) {
embed.addField(client.users.get(data.user).tag, `${data.points} points (level ${data.level})`);
}
return message.channel.send({embed});
}
Но когда я запускаю команду, я получаю это в командной строке / журналах:
embed.addField(client.users.get(data.user).tag, `${data.points} points (level ${data.level})`);
^
TypeError: Cannot read property 'tag' of undefined
at Object.exports.run (/app/commands/leaderboard.js:19:47)
at module.exports (/app/events/message.js:19:7)
at emitOne (events.js:121:20)
at Client.emit (events.js:211:7)
at MessageCreateHandler.handle (/rbd/pnpm-volume/461f582b-2c68-44a2-912c-88cd1fefb0fa/node_modules/.registry.npmjs.org/discord.js/11.4.2/node_modules/discord.js/src/client/websocket/packets/handlers/MessageCreate.js:9:34)
at WebSocketPacketManager.handle (/rbd/pnpm-volume/461f582b-2c68-44a2-912c-88cd1fefb0fa/node_modules/.registry.npmjs.org/discord.js/11.4.2/node_modules/discord.js/src/client/websocket/packets/WebSocketPacketManager.js:103:65)
at WebSocketConnection.onPacket (/rbd/pnpm-volume/461f582b-2c68-44a2-912c-88cd1fefb0fa/node_modules/.registry.npmjs.org/discord.js/11.4.2/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:333:35)
at WebSocketConnection.onMessage (/rbd/pnpm-volume/461f582b-2c68-44a2-912c-88cd1fefb0fa/node_modules/.registry.npmjs.org/discord.js/11.4.2/node_modules/discord.js/src/client/websocket/WebSocketConnection.js:296:17)
at WebSocket.onMessage (/rbd/pnpm-volume/461f582b-2c68-44a2-912c-88cd1fefb0fa/node_modules/.registry.npmjs.org/ws/4.1.0/node_modules/ws/lib/event-target.js:120:16)
at emitOne (events.js:116:13)
Я перенес бота со своего компьютера на glitch.com что, казалось, решило проблему на какое-то время, но теперь проблема вернулась.
Комментарии:
1. Как выглядит data.user? Вы знаете, что вы должны использовать идентификатор пользователя
Ответ №1:
Ошибка означает client.users.get(data.user)
, что возвращается значение undefined, следовательно, у него не может быть свойства tag
. Предположительно, это означает, что пользователь, указанный в data, не существует.
Вы должны добавить некоторый защитный код, прежде чем пытаться напрямую получить доступ к свойству, чтобы убедиться, что get()
вызов возвращает что-то, а не неопределенное.
Например
const user = client.users.get(data.user);
if (user amp;amp; user.tag) {
// code here
} else {
// user does not exist..
}
Комментарии:
1. Хотя рекомендуется убедиться, что что-то возвращается, использование
client#users
для поиска пользователя — нет. Он содержит только ранее кэшированных пользователей. Правильный способ найти пользователя Discord — этоclient#fetchUser()
.
Ответ №2:
client.users.get(data.user)
не определено в вашем коде. Прямо из Discord.js документы, Client.users
есть…
Все пользовательские объекты, которые были кэшированы в любой момент, сопоставлены по их идентификаторам
Вместо того, чтобы полагаться исключительно на кэш клиента, вы можете получить пользователя из Discord API с помощью Client.fetchUser()
метода. Имейте в виду, оно возвращает обещание.
// async context required to use 'await'
await client.fetchUser(data.user);