Ошибка типа: Не удается прочитать свойство «фильтр» неопределенного — Не уверен, как исправить

#node.js #discord.js

Вопрос:

Хорошо, я понимаю, что мне, возможно, потребуется добавить команду типа if(!фильтр) в следующее, но я не уверен, где и как.

Файл кода находится:

 const Discord = require('discord.js');
const config = require('../settings/config.js');
const client = require('../index.js').client;
const Guild_ID = require('../settings/configuration').BOT_SETTINGS;
const totalUsers = client.channels.fetch('859879787614437427');
const onlineUsers = client.channels.fetch('859879824403202059');
const onlineStaff = client.channels.fetch('859879875531374672');

client.guilds.fetch('802700035544317972')
  .then(guild => console.log(guild.name))
  .catch(console.error);

setInterval(function() {
  console.log('Getting stats update..')

  var userCount = client.memberCount;
  var onlineCount = client.members.filter(m => m.presence.status === 'online').size
  var coderCount = client.roles.get('802711739006582846').members.size;
  
  console.log("Total Users: "   userCount);
  console.log("Online Users: "   onlineCount);
  console.log("Online Staff: "   coderCount);

  totalUsers.setName("Total Users: "   userCount)
  .then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
  .catch(console.error);

  onlineUsers.setName("Online Users: "   onlineCount)
  .then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
  .catch(console.error);

  codeMonkeys.setName("Online Staff: "   coderCount)
  .then(newChannel => console.log(`Stat channel renamed to: ${newChannel.name}`))
  .catch(console.error);
  }, 30000)
;
 

Мое сообщение об ошибке выглядит так:

 Getting stats update..
[Error] An exception happened in process: 
TypeError: Cannot read property 'filter' of undefined
    at Timeout._onTimeout (/home/container/events/Stats.js:17:36)
    at listOnTimeout (node:internal/timers:557:17)
    at processTimers (node:internal/timers:500:7)
 

У меня есть половина представления об исправлении, но я не уверен в его фактическом выполнении. Любая помощь будет признательна.

Ответ №1:

Discord.js, начиная с версии 12.0.0, предоставляет только предварительно созданное свойство client.members для участников, которые кэшируются Discord. Пользователи, которые не кэшируются, должны быть извлечены и разрешены, поскольку fetch() метод возвращает обещание.

Что касается вашего вопроса, то к этому свойству можно получить доступ с помощью его ключа cache .

 var onlineCount = client.members.cache.filter(m => m.presence.status === 'online').size
 

В качестве примечания, пожалуйста, приучите себя использовать let , const когда var в этом нет необходимости.

Ответ №2:

Внимательно прочитайте ошибку, ее не if(!filter) нужно проверять. Это то, что вы пытаетесь отфильтровать, то есть undefined .

В вашем случае это линия виновника:

 var onlineCount = client.members.filter(m => m.presence.status === 'online').size  
 

Похоже, что client.members на данный момент это не определено.

Простое решение состоит в том, чтобы проверить, существуют ли участники перед фильтрацией:

 if(client.members !== undefined) {
// I'm also guessing this is an array, the right property to get array size is .length
var onlineCount = client.members.filter(m => m.presence.status === 'online').length
}
 

Редактировать

Я быстро взглянул на discord.js API(предполагая, что вы его используете), и я не смог найти никакого members свойства client объекта. Может быть, ты пытаешься заполучить членов гильдии?

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

1. На данный момент у меня в коде нет функции If; нужно ли ее добавлять? Отредактировал сообщение, чтобы включить полную ошибку из консоли

2. Это не функция, это оператор if выражение, я отредактирую для ясности.

3. По сути, я следовал учебнику, который означает, что он должен автоматически обновлять определенные каналы, чтобы обновить общее количество участников сервера, общее количество онлайн-пользователей и сотрудников, находящихся в настоящее время в сети. (Я расширюсь позже, как только у меня будут основы!)

4. Не стесняйтесь редактировать вопрос со ссылкой на учебник, который поможет сузить круг вопросов.

5. Оригинальный урок, которому я следовал, был таким: youtube.com/watch?v=k9fqGh5Cr5s