为什么await不适用于节点请求模块?

时间:2016-07-18 03:04:05

标签: node.js asynchronous async-await ecmascript-next

我是nodejs的新手。我没有在前1中看到响应,但我在前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功能所需的模块。例如,await在squelize call中工作,我验证了。但它不适用于请求调用。为什么呢?

4 个答案:

答案 0 :(得分:83)

你应该只对{1}}返回一个Promise。在你开始使用awaitasync之前,我肯定会建议您阅读Promise。您可以通过在await周围创建自己的包装函数来使这个示例工作,以使其返回一个承诺,如下所示:

request

编辑:或者,您可以考虑使用request-promise而不是常规请求模块。

答案 1 :(得分:16)

<强> ES6

用法: requestrequire('./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)
        })
    })

答案 2 :(得分:1)

尝试以下NPM软件包

node-fetch

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

希望它能起作用。

答案 3 :(得分:0)

如@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