Почему возникает ошибка "undefined" и "NaN" при выполнении команды в Discord.js?

Как исправить ошибки "undefined" и "NaN" в моей команде слеша, использующей библиотеку systeminformation для получения информации об оперативной памяти, процессоре, операционной системе и т. д.? Код команды:
```javascript
const { SlashCommandBuilder } = require('discord.js');
const si = require('systeminformation');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('uptime')
    .setDescription('Получает информацию об ОЗУ, процессоре и нагрузке ядер).'),
  async execute(interaction) {
    let osInfo = si.osInfo();
    let cpuInfo = si.cpu();
    let cpuLoad = si.currentLoad();
    let memInfo = si.mem();
    return interaction.reply({
      content: `**Информация о системе:**
      - Операционная система: ${osInfo.platform} ${osInfo.distro}
      - Версия ядра: ${osInfo.kernel}
      - Архитектура процессора: ${cpuInfo.arch}
      - Название процессора: ${cpuInfo.manufacturer} ${cpuInfo.brand}
      - Количество ядер: ${cpuInfo.cores}
      - Загрузка ЦП: ${cpuLoad.currentload}%
      - Использование ОЗУ: ${((memInfo.used / memInfo.total) * 100).toFixed(2)}%
      - Общий объем ОЗУ: ${Math.round(memInfo.total / 1024 / 1024)} MB`
    });
  },
};
```
Версия Node.js - v20.5.0
Версия Discord.js - v14.13.0
Изображение к вопросу
  • 14 октября 2023 г. 21:00
Ответы на вопрос 2
Ошибка "undefined" возникает, когда переменной присваивается значение undefined. Это может произойти, если функция или метод, которые должны вернуть значение, не возвращают его. В вашем коде ошибка "undefined" может быть вызвана использованием методов из библиотеки systeminformation без ожидания их завершения и получения результата.

Ошибка "NaN" возникает, когда происходят математические операции с операндами, не являющимися числами. В вашем коде ошибка "NaN" может быть вызвана делением на 0 или использованием некорректных числовых значений.

Чтобы исправить эти ошибки, вам необходимо использовать асинхронные функции и ожидать завершения методов из библиотеки systeminformation с помощью ключевого слова "await". Также стоит проверить значения, которые вы используете для математических операций, чтобы убедиться, что они являются числами.

Вот исправленный код вашей команды с использованием асинхронных функций и ожидания завершения методов:

```javascript
const { SlashCommandBuilder } = require('discord.js');
const si = require('systeminformation');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('uptime')
    .setDescription('Получает информацию об ОЗУ, процессоре и нагрузке ядер.'),
  async execute(interaction) {
    let osInfo = await si.osInfo();
    let cpuInfo = await si.cpu();
    let cpuLoad = await si.currentLoad();
    let memInfo = await si.mem();
    
    return interaction.reply({
      content: `**Информация о системе:**
      - Операционная система: ${osInfo.platform} ${osInfo.distro}
      - Версия ядра: ${osInfo.kernel}
      - Архитектура процессора: ${cpuInfo.arch}
      - Название процессора: ${cpuInfo.manufacturer} ${cpuInfo.brand}
      - Количество ядер: ${cpuInfo.cores}
      - Загрузка ЦП: ${cpuLoad.currentload}%
      - Использование ОЗУ: ${((memInfo.used / memInfo.total) * 100).toFixed(2)}%
      - Общий объем ОЗУ: ${Math.round(memInfo.total / 1024 / 1024)} MB`
    });
  },
};
```

Кроме того, у вас указана неправильная версия Node.js (v20.5.0). Пожалуйста, обновите до актуальной версии (например, v14.17.6) для избежания возможных проблем совместимости.
в документации к библиотеке указано, что функции .osInfo(), .cpu(), .currentLoad() и .mem() возвращают промисы. Если написать si.osInfo() в коде, то результатом будет объект Promise. Этот объект Promise не содержит свойств platform, distro и kernel, которые вы пытаетесь получить. При попытке получить доступ к несуществующему свойству объекта результатом будет undefined. То же самое относится к другим функциям si.cpu(), si.currentLoad() и т.д.

Примечание: при выполнении математических операций с undefined будет получено значение NaN. 

Вывод: перед тем, как писать ботов или что-либо еще, важно хорошо изучить язык программирования. 

Ссылки для изучения:
- https://learn.javascript.ru/promise-basics
- https://learn.javascript.ru/async-await
Похожие вопросы