AlexZeDim
@AlexZeDim

Экспорт promise/асинхронной функции (результата) node.js через module.exports?

Привет!

И так, вопрос который наверняка поднимается с каждой новой версией JS и практически каждым, кто сталкивался чем-то асинхронным на node.js.

Есть код модуля (кратко):
function имя1 (параметр_из_формы) {
        request (параметры)
            .then(response => {
                let charset = [];
                charset.name = response.data.
                //здесь код, который что-то делает
                return (charset);
            })
            .then(charset => {
                if (charset.value=== undefined) {
                    charset.value= 'PR10';
                } else {
                    charset.guild = charset.guild.name;
                }

                return charset; //то, что мне надо получить в app.js
            })
            .catch(function (error) {
                console.log('ошибка')
            });
    }
module.exports = имя1

И есть app.js где у нас mongoDB через mongoose:
const trade_log = require("./db/models/trade_log");
const имя1 = require("./db/ops/модуль");
app.all('/log', function (req, res, next) { //это у нас Express
    let x = имя1(req.body.Counterparty); //вот здесь у меня проблема
    trade_log.create({ //тут мы пишем в базу
        Flag: req.body.Flag,
        Instrument: req.body.Instrument,
        Venue: req.body.Venue,
        Price: req.body.Price,
        Currency: req.body.Currency,
        Quantity: req.body.Quantity,
        Counterparty: req.body.Counterparty,
        Identifier: x,
        Commentary: req.body.Commentary,
    },function (err, res) {
        if (err) return console.log (x) + handleError(err);
        console.log(res);
    });
    next();
});


Проблема заключается в том, что у меня никак не получается экспортировать результат самой функции и записать её в переменную. Спустя сутки гуглкодинга, я так понимаю это проблема которая лежит в плоскости async/await функций и promise. Потому что. когда я пытаюсь (и пытался до этого) экспортировать функцию из своего модуля у меня получается так. что:
  • или x возвращает 'undefind' т.е. очевидно что код выполняется отлично сам по себе, просто из-за асинхроннщины, ответ на запрос прилетает дольше, чем идет запить в MongoDB и переменная не успевает записаться
  • или в консоль падает ошибка что имя1 не является функцией.

Я точно знаю, что сам код написан верно и корректно, и независимо друг от друга он выполяется правильно. Собственно помимо toster'а, я уже достаточно погуглил и понял, что надо или модуль подписать под промисы (что я неоднократко пытался делать, но у меня слабо получалось) или использоваться ES7 т.е. async/await, что достаточно просто и интересно, но почему-то подобный код в app.js, не останавливал выполнение там где необходимо:
app.all('/log', async function (req, res, next) { //это у нас Express
    let x = await имя1(req.body.Counterparty)

Последовательность действий, как она должна быть:
  1. Получаю данные в POST через форму,
  2. Функций из модуля берет значение из поля в качестве параметра и отправляет http request
  3. Результат приходит назад (и/или пишется в переменную)
  4. Все данные пишутся в БД

А получается так, что шаг 4, происходит раньше, чем шаг 3
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Coder321
Как то так
module.exports = async function имя1(params) {
    try {
        const response = await request(params);
        let charset = [];
        charset.name = response.data;
        const charsetResult = await someFunc(charset);
        if (charsetResult.value === undefined) {
            charsetResult.value = 'PR10';
        } else {
            charsetResult.guild = charset.guild.name;
        }
        return charsetResult;
    } catch (error) {
        console.log(error);
    };
}
Ответ написан
megafax
@megafax
web-программист
Вроде же все просто.
function имя1 (параметр_из_формы) {
return request (параметры) /*****/ 
}

...
let x = имя1(req.body.Counterparty)
           .then(() => trade_log.create({/***/}));
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
OneTwoTrip! Москва
от 120 000 до 200 000 руб.
1Win Санкт-Петербург
от 80 000 до 200 000 руб.
Acme Crypto Corp Нижний Новгород
от 150 000 до 250 000 руб.
20 авг. 2018, в 19:05
3000 руб./за проект
20 авг. 2018, в 18:36
500 руб./в час
20 авг. 2018, в 18:25
10000 руб./за проект