Маршрутизатор NodeJS, использующий другую функцию, которая вызывает запрос, не ожидает ответа - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть какой-то маршрут:

router.get('/test', async function (req, res, next) {
    let someValue = await someFunction();
    console.log(someValue);
}

И функция, которая GET запрашивает какую-то другую услугу:

async function someFunction() {
let options = {
    url: `someURL`,
    method: 'GET',
};
request(options, async function (error, response, body) {
    if (error) {
        throw error;
    } else {
        return body['someSpecificValue'];
    }
});

}

и, тем не менее, кажется, что в моем маршрутизаторе someValue всегда печатается как undefined.

Что я делаю не так? как мне правильно ждать ответа от someURL?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2019

Вы можете использовать node-fetch модуль, который является асинхронным, вместо запроса

npm i node-fetch

Вот пример

const fetch = require("node-fetch");
const url = "https://jsonplaceholder.typicode.com/posts/1";
const getData = async url => {
  try {
    const response = await fetch(url);
    const json = await response.json();
    console.log(json);
  } catch (error) {
    console.log(error);
  }
};
getData(url);
1 голос
/ 09 апреля 2019

потому что someFunction не возвращает обновление обещания, как показано ниже, или использует request-обещание .

function someFunction() {
    let options = {
        url: `someURL`,
        method: 'GET',
    };
    return new Promise((res, rej) => {
        request(options, function (error, response, body) {
            if (error) {
                return res(error);
            }
            return rej(body['someSpecificValue']);
        });
    });
}

OR

var rp = require('request-promise');

function someFunction() {
    let options = {
        url: `someURL`,
        method: 'GET',
    };
    return rp(options);
}
...