Становится неопределенным в функции, используемой в модуле.экспорт

#javascript #node.js #discord.js

Вопрос:

Итак, я пытаюсь создать функцию, которая при использовании дает ожидаемый результат, подобный этому

 {
  id: 'ID_OF_THE_USER',
  username: 'USERNAME_OF_THE_USER',
  avatar: 'AVATAR_ID_OF_THE_USER',
  discriminator: 'THE_TAG',
  public_flags: SOME_NUMBER,
  banner: null,
  banner_color: 'A_HEXCODE',
  accent_color: SOME_NUMBER
}
 

Однако я получаю правильный результат, когда использую функцию в своем main.js файл, но когда у меня есть функция в другом файле (например: function.js) и использовать module.exports в этом внешнем файле и использовать эту функцию в main.js файл, я получаю неопределенное значение.

Функция, о которой я говорю,:

 const Discord = require('discord.js');

const client = new Discord.Client();

client.login('MyBotToken');

client.api.users('SomeUserID').get().then((result) => { return resu< });
 

Мой нынешний function.js файл:

 const Discord = require('discord.js');

module.exports =
{
   user: function(UserID)
    {
       const client = new Discord.Client();

       client.login('MyBotToken');

       client.api.users(UserID).get().then((result) => { return resu< });
    }
}
 

Мой нынешний main.js файл:

 const details = require('./function');

const userInfo = details.user('SomeUserID');

console.log(userInfo);
 

Теперь, когда я запускаю свой main.js файл, я получаю неопределенное значение.
Любая помощь будет оценена по достоинству !

Версия моего узла: 14.16 Моя Discord.js версия: 12.5.3

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

1. В вашей экспортируемой функции нет return оператора.

Ответ №1:

У вас есть две проблемы. Во-первых, ваша функция user() не имеет оператора return и, следовательно, вообще не возвращает никакого значения. return result Это относится не к области действия user() , а только к анонимной функции, переданной .then() . Тогда .then((result) => { return resu< }) в вашем примере целое выражение вообще не имеет никакого эффекта, так как любое возвращаемое значение из переданной функции .then() обещания само автоматически будет заключено в обещание.

Вторая проблема заключается в том, что ваш код main.js не ожидает обещания. Чтобы «получить» значение из обещания, возвращенного из API Discord, вы должны либо использовать await его в контексте, где это возможно (внутри async функции или на верхнем уровне модуля ES), либо с помощью .then() назначить функцию для обработки результата, когда обещание будет выполнено. Вы не можете вернуть значение в «несинхронную» область.

Что вы могли бы сделать, чтобы смягчить эти проблемы, так это переписать function.js на

 const Discord = require('discord.js');

module.exports = {
  user: function(UserID) {
    const client = new Discord.Client();
    client.login('MyBotToken');
    return client.api.users(UserID).get();
  }
}
 

и main.js чтобы

 const details = require('./function');
details
  .user('SomeUserID')
  .then((userInfo) => { console.log(userInfo); });
 

Если бы вы вместо этого вызывали свою user() функцию внутри async функции, вы могли бы просто сделать

 const details = require('./function');
const userInfo = await details.user('SomeUserID');
console.log(userInfo);
 

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

1. эй, @Mikael, я использовал это на своем main.js « const details = требуется(‘./функция’); const userInfo = ожидает сведений.пользователь(‘идентификатор пользователя’); console.log(userInfo); ` » но я получил ошибку, указывающую на синтаксическую ошибку: ожидание допустимо только в асинхронной функции, пожалуйста, помогите 🙂

2. эй, @Mikael ! на самом деле, nvm я нашел ответ на свою проблему > Вы не можете вернуть значение в «несинхронную» область.