Почему ожидание не работает для модуля запроса node?

Я новичок в nodejs. Я не вижу ответа в ex 1, но я вижу в ex 2. Почему? Ожидание работает для меня в других местах, используя babel.

Ex 1

 let res = await request(url)
 console.log(res);
 console.log(res.body);

Ex 2

request(url, function (error, res, body) {
 if (!error && response.statusCode == 200) {
 console.log(body) 
 }
});

Ожидание работает в других местах, я использую babel и требуемые модули для функций es6 и es7. Например, ждут работы в squelize call, я проверен. Но он не работает для запроса вызова. Почему?

Ответ 1

Вы должны только await на что-то, что возвращает Promise. Я определенно рекомендую читать Promises, прежде чем приступать к работе с async и await. Вероятно, вы можете заставить этот пример работать, создав свою собственную функцию-обертку вокруг request, чтобы вернуть ее, например:

function doRequest(url) {
  return new Promise(function (resolve, reject) {
    request(url, function (error, res, body) {
      if (!error && res.statusCode == 200) {
        resolve(body);
      } else {
        reject(error);
      }
    });
  });
}

// Usage:

async function main() {
  let res = await doRequest(url);
  console.log(res);
}

main();

Изменить: альтернативно вы можете использовать request-promise вместо обычного модуля запроса.

Ответ 2

ES6

Использование: Где request есть require('./await-request')

const init = async () => {
    try {
        const result = await request({
            uri: 'statdirectory/exchange?json',
            baseUrl: 'https://bank.gov.ua/NBUStatService/v1/',
            json: true
        })
        console.log(result)
    }
    catch (err) {
        console.error(err)
    }
}

Код:

// request-service.js
const request = require('request')

module.exports = async (value) => 
    new Promise((resolve, reject) => {
        request(value, (error, response, data) => {
            if(error) reject(error)
            else resolve(data)
        })
    })