65

我是nodejs的新手。我在 ex 1 中没有看到响应,但我在 ex 2 中看到了。为什么?Await 在其他地方为我工作,使用 babel。

例 1

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

前 2

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

Await 在其他地方工作,我正在使用 babel 和 es6 和 es7 功能所需的模块。例如,我验证了 await 在 squelize 调用中工作。但它不适用于请求调用。为什么?

4

4 回答 4

189

你应该只await在返回 Promise 的东西上。我绝对建议在开始使用asyncand之前阅读 Promises 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();

编辑:或者,您可以考虑使用基于承诺的请求库而不是常规请求模块。

于 2016-07-18T03:11:33.190 回答
22

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)
    }
}

代码:

// await-request.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)
        })
    })
于 2016-11-11T16:38:19.447 回答
17

正如@saadq 所说,您只能“等待”返回 Promise 的函数。

我喜欢使用 Node.js 的util包来承诺一个带有回调的函数。所以util+request可以这样使用:

const util = require('util')
const request = require("request");

const requestPromise = util.promisify(request);
const response = await requestPromise(url);
console.log('response', response.body);

演示:https ://runkit.com/mhmtztmr/node-js-request-with-async-await

于 2019-02-13T10:01:13.847 回答
2

尝试使用以下 NPM 包

节点获取

          var url = "http://www.google.com";
          try 
          {
            const response = await fetch(url);
            const json = await response.json();
            return {message:json.message,status:json.type};
          }
          catch(error)
          {
            console.log(error);
          }

希望它有效。

于 2018-09-26T05:35:04.130 回答