Я получаю необработанный отказ от обещания, для которого мне нужен правильный синтаксис в nodejs

Я создал модуль, который извлекает данные из API binance us, но не могу правильно отправить эту переменную в какой-либо другой файл. Я пытаюсь создать функцию, которая извлекает переменную каждый раз при запуске и отправляет ее для использования в качестве динамической переменной в другом файле.

Это мой обновленный код функции из обсуждений ниже в /modules/Tradepair.js:

async function getTradepair() {
  const apiUrl = "https://api.binance.us/api/v3/ticker/24hr";
  // Make a GET request
 let data ;
 try{
    const response = await fetch(apiUrl);
    if (!response.ok) {
       throw new Error("Network response for pair was not ok");
    }
     data = await response.json();
    //  console.info(data);

 } catch (error) {
     console.error('There was a problem with the fetch operation:', error);
}
  const max = data.reduce(
      (a, b) => (a.priceChangePercent > b.priceChangePercent ? a : b), data[0]);
  console.info(`Max Symbol from API: ${max.symbol}`);
  console.info(`Max Percent from API: ${max.priceChangePercent}`);
  const tradingPair = max.symbol;
  console.info(`Assigned to Trading pair variable: ${tradingPair}`);
  return tradingPair; // Return the tradingPair variable
}
module.exports = getTradepair;

Это обновленная версия из обсуждений ниже:

require("dotenv").config();
const Wolf = require("./modules/Wolf.js");
const getTradepair = require("./modules/Tradepair.js"); //file-name where you have defined this `getTradepair()` function.

async function getData() {
  try {
    const data = await getTradepair();
    console.info("From index:" + " " +data);
    return data;
  } catch (error) {
    console.error("Error fetching data:", error);
  }
}

const config = {
  // tradingPair: process.env.TARGET_ASSET + process.env.BASE_ASSET,
  tradingPair: getData(),
  profitPercentage: Number(process.env.PROFIT_PERCENTAGE) / 100,
  budget: Number(process.env.BUDGET),
  compound: process.env.COMPOUND.toLowerCase() === "true",
  profitLockPercentage: Number(process.env.PROFIT_LOCK_PERCENTAGE) / 100,
  stopLimitPercentage: Number(process.env.STOP_LIMIT_PERCENTAGE) / 100,
};

const wolf = new Wolf(config);

И это ошибка, которую я продолжаю получать:

Max Symbol from API: VITEUSDT
Max Percent from API: 6.467
Assigned to Trading pair variable: VITEUSDT
From index: VITEUSDT
node:internal/process/promises:289
            triggerUncaughtException(err, true /* fromPromise */);
            ^

[UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "false".] {
  code: 'ERR_UNHANDLED_REJECTION'
}

Node.js v20.12.1
[nodemon] app crashed - waiting for file changes before starting...

Содержит ли этот модуль /modules/Tradepair.js код getTradepair() ? Вы даже не импортировали его правильно. ответ на ваш fetch() звонок не возвращается корректным образом. Вот почему вы получаете UnhandledPromiseRejection ошибку.

Subha 26.06.2024 12:25

Да, /modules/Tradepair.js содержит функцию getTradepair(). Каков правильный способ импорта и правильной настройки вызова для возврата?

Duane Bednorz 26.06.2024 17:16

Привет, я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать.

Subha 26.06.2024 19:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
113
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Прежде чем Promise будет разрешено, это getData() выполняется синхронно, что не является допустимой практикой, и именно поэтому вы видите эту ошибку.

После определения getTradepair() как функции async импортируйте и выполните эту функцию следующим образом.

const getTradepair = require('./modules/your-file-name'); //file-name where you have defined this `getTradepair()` function.

async function getData(){

 try {
        const data = await getTradepair();
        console.info(data);
        return data ;
     } catch (error) {
        console.error('Error fetching data:', error);
     }

 }

 getData().then((data) => {

   const config = {
     // tradingPair: process.env.TARGET_ASSET + process.env.BASE_ASSET,
     tradingPair: data,
     profitPercentage: Number(process.env.PROFIT_PERCENTAGE)/100,
     budget: Number(process.env.BUDGET),
     compound: process.env.COMPOUND.toLowerCase() === "true",
     profitLockPercentage: Number(process.env.PROFIT_LOCK_PERCENTAGE)/100,
     stopLimitPercentage: Number(process.env.STOP_LIMIT_PERCENTAGE)/100

   };

   const wolf = new Wolf(config);

   console.info(wolf); // you can also console to see your expected result 

  } ).catch((error) => {

     console.error("Error:", error);

  });

Попробуйте приведенный выше код. Я уверен, что вы не получите эту UnhandledPromiseRejection ошибку. Тем не менее, если что-то не пойдет, пожалуйста, не утруждайтесь просить о помощи.

Спасибо, я пока не получаю необработанного отклонения обещания. Я получаю ошибку SyntaxError: Неожиданный «экспорт» токена, которую я устал решать, устанавливая экспресс, но, похоже, это не помогает.

Duane Bednorz 26.06.2024 19:14

Подскажите, пожалуйста, в какой строке кода выдает эту ошибку? Я имею в виду, какая именно строка кода выдает эту ошибку во время выполнения? Вам нужно просто заменить приведенный выше код вместо вашего кода, сохранив все остальные аспекты такими же. Однако ошибка, которую вы получаете, является синтаксической ошибкой.

Subha 26.06.2024 19:17

@DuaneBednorz, удалите export из export async function getTradepair() и после определения функции добавьте export { getTradepair }; или module.exports = getTradepair;. Я думаю, это решит проблему. Это проблема совместимости ES6. Попробуйте и дайте мне знать. `

Subha 26.06.2024 19:27

1) экспортировать асинхронную функцию getTradepair() { - вызвала синтаксическую ошибку 2) экспортировать {getTradepair}; ^^^^^^ Синтаксическая ошибка: неожиданный «экспорт» токена 3) модуль.exports = getTradePair; вызвало это - Ошибка выборки данных: TypeError: не удалось получить СИМВОЛ ОШИБКА: не удалось получить узел: внутренний/процесс/обещания: 289 триггерUncaughtException (err, true /* fromPromise */); ^

Duane Bednorz 26.06.2024 19:39

Какая у вас версия узла? Проблема с соглашением об именах. Было бы module. exports = getTradepair имя должно быть таким же, как имя функции @DuaneBednorz

Subha 26.06.2024 19:48

$узел -v v20.12.1

Duane Bednorz 26.06.2024 19:50

Я попробовал несколько разных способов: модуль. экспорт = getTradepair; модуль. экспорт = модуль getTradepair. экспорт = модуль getTradepair(). экспорт = getTradepair(); Та же ошибка

Duane Bednorz 26.06.2024 20:00

@DuaneBednorz, поскольку при использовании TypeError: fetch failed возникает эта ошибка module.exports = getTradePair;, я думаю, что есть некоторая проблема с получением данных. Поэтому я реализовал блок try-catch внутри getTradepair(), чтобы в случае ошибки fetch() его можно было правильно обработать... пожалуйста, проверьте мой отредактированный код и реализовать код. Здесь module.exports = getTradePair; имя должно совпадать с именем функции, что означает module.exports = getTradepair;. Этот код должен работать. Пожалуйста, проверьте и дайте мне знать.

Subha 26.06.2024 20:12

@DuaneBednorz, еще один момент, на который следует обратить внимание: ваш код работает хорошо. Но ошибка, которую вы получаете, — это ошибка вашей конечной точки API. Потому что вы получаете сообщение об ошибке, начиная с этого Error fetching data, которое так написано в файле, где вы объявили const = config = {.. для фиксации ошибки в случае возникновения какой-либо проблемы с конечной точкой API. Поэтому, пожалуйста, проверьте всю соответствующую конфигурацию, касающуюся конечной точки API. Код работает правильно, но конечная точка API не отправляет данные.

Subha 26.06.2024 20:26

Обновлено - журналы консоли работают, ошибка выборки исчезла, но: node:internal/process/promises:289 триггерUncaughtException(err, true /* fromPromise */); ^ [UnhandledPromiseRejection: эта ошибка возникла либо из-за вызова внутри асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch(). Обещание отклонено по причине «ложь».] { code: 'ERR_UNHANDLED_REJECTION' } Node.js v20.12.1

Duane Bednorz 26.06.2024 20:27

@DuaneBednorz использовал блок catch после импорта функции. Прочтите мой предыдущий комментарий, где я пояснил, что предыдущая версия кода также работала, поскольку выдавала ошибку из блока catch, где вы извлекаете данные. Проверьте мой предыдущий комментарий. Я думаю, что конечная точка API отправляет данные правильно. Блок Catch был там, чтобы вызвать ошибку.

Subha 26.06.2024 20:36

Я обновил свой текущий код выше, я больше не получаю сообщение об ошибке из блока catch после импорта, но все еще получаю необработанное отклонение обещания, и журналы консоли отправляют мне данные API.

Duane Bednorz 26.06.2024 21:33

Я изменил свой код, чтобы проверить ошибку конфигурации API: async function getTradepair() { TradingPair = "BTCUSDT"; возврат торговой пары; } Module.exports=getTradepair; Переменная передается, но ошибка все та же: TradePair Из индекса: BTCUSDT | Инициализация... node:internal/process/promises:289 триггерUncaughtException(err, true /* fromPromise */); ^

Duane Bednorz 27.06.2024 00:17

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

Subha 27.06.2024 08:54

@DuaneBednorz, я обновил вторую часть своего ответа. Я заключил весь код в Resolved Promise State. Попробуйте, это сработает. Также эта часть кода проверена с моей стороны.

Subha 27.06.2024 09:03

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

Subha 27.06.2024 18:28

Другие вопросы по теме