Я создал модуль, который извлекает данные из 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(). Каков правильный способ импорта и правильной настройки вызова для возврата?
Привет, я опубликовал свой ответ. Пожалуйста, проверьте и дайте мне знать.
Прежде чем 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: Неожиданный «экспорт» токена, которую я устал решать, устанавливая экспресс, но, похоже, это не помогает.
Подскажите, пожалуйста, в какой строке кода выдает эту ошибку? Я имею в виду, какая именно строка кода выдает эту ошибку во время выполнения? Вам нужно просто заменить приведенный выше код вместо вашего кода, сохранив все остальные аспекты такими же. Однако ошибка, которую вы получаете, является синтаксической ошибкой.
@DuaneBednorz, удалите export
из export async function getTradepair()
и после определения функции добавьте export { getTradepair };
или module.exports = getTradepair;
. Я думаю, это решит проблему. Это проблема совместимости ES6. Попробуйте и дайте мне знать. `
1) экспортировать асинхронную функцию getTradepair() { - вызвала синтаксическую ошибку 2) экспортировать {getTradepair}; ^^^^^^ Синтаксическая ошибка: неожиданный «экспорт» токена 3) модуль.exports = getTradePair; вызвало это - Ошибка выборки данных: TypeError: не удалось получить СИМВОЛ ОШИБКА: не удалось получить узел: внутренний/процесс/обещания: 289 триггерUncaughtException (err, true /* fromPromise */); ^
Какая у вас версия узла? Проблема с соглашением об именах. Было бы module. exports = getTradepair
имя должно быть таким же, как имя функции @DuaneBednorz
$узел -v v20.12.1
Я попробовал несколько разных способов: модуль. экспорт = getTradepair; модуль. экспорт = модуль getTradepair. экспорт = модуль getTradepair(). экспорт = getTradepair(); Та же ошибка
@DuaneBednorz, поскольку при использовании TypeError: fetch failed
возникает эта ошибка module.exports = getTradePair;
, я думаю, что есть некоторая проблема с получением данных. Поэтому я реализовал блок try-catch
внутри getTradepair()
, чтобы в случае ошибки fetch()
его можно было правильно обработать... пожалуйста, проверьте мой отредактированный код и реализовать код. Здесь module.exports = getTradePair;
имя должно совпадать с именем функции, что означает module.exports = getTradepair;
. Этот код должен работать. Пожалуйста, проверьте и дайте мне знать.
@DuaneBednorz, еще один момент, на который следует обратить внимание: ваш код работает хорошо. Но ошибка, которую вы получаете, — это ошибка вашей конечной точки API. Потому что вы получаете сообщение об ошибке, начиная с этого Error fetching data
, которое так написано в файле, где вы объявили const = config = {..
для фиксации ошибки в случае возникновения какой-либо проблемы с конечной точкой API. Поэтому, пожалуйста, проверьте всю соответствующую конфигурацию, касающуюся конечной точки API. Код работает правильно, но конечная точка API не отправляет данные.
Обновлено - журналы консоли работают, ошибка выборки исчезла, но: node:internal/process/promises:289 триггерUncaughtException(err, true /* fromPromise */); ^ [UnhandledPromiseRejection: эта ошибка возникла либо из-за вызова внутри асинхронной функции без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch(). Обещание отклонено по причине «ложь».] { code: 'ERR_UNHANDLED_REJECTION' } Node.js v20.12.1
@DuaneBednorz использовал блок catch после импорта функции. Прочтите мой предыдущий комментарий, где я пояснил, что предыдущая версия кода также работала, поскольку выдавала ошибку из блока catch, где вы извлекаете данные. Проверьте мой предыдущий комментарий. Я думаю, что конечная точка API отправляет данные правильно. Блок Catch был там, чтобы вызвать ошибку.
Я обновил свой текущий код выше, я больше не получаю сообщение об ошибке из блока catch после импорта, но все еще получаю необработанное отклонение обещания, и журналы консоли отправляют мне данные API.
Я изменил свой код, чтобы проверить ошибку конфигурации API: async function getTradepair() { TradingPair = "BTCUSDT"; возврат торговой пары; } Module.exports=getTradepair; Переменная передается, но ошибка все та же: TradePair Из индекса: BTCUSDT | Инициализация... node:internal/process/promises:289 триггерUncaughtException(err, true /* fromPromise */); ^
@DuaneBednorz, извини, это была моя ошибка. Прежде чем обещание будет разрешено, этот getData() выполняется синхронно, поэтому вы видите эту ошибку. Я обновляю свой ответ во втором блоке кода. Пожалуйста, сделайте это, он обязательно сработает.
@DuaneBednorz, я обновил вторую часть своего ответа. Я заключил весь код в Resolved Promise State
. Попробуйте, это сработает. Также эта часть кода проверена с моей стороны.
@DuaneBednorz, если это решит вашу проблему, пожалуйста, примите мой ответ, чтобы другие могли воспользоваться им, кто сталкивается с подобной проблемой.
Содержит ли этот модуль
/modules/Tradepair.js
кодgetTradepair()
? Вы даже не импортировали его правильно. ответ на вашfetch()
звонок не возвращается корректным образом. Вот почему вы получаетеUnhandledPromiseRejection
ошибку.