Как исправить: «Ошибка TypeError: не удается прочитать свойство ‘tag’ неопределенного» ошибка в discord.js

#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);