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

问题描述 投票:30回答:4

我是nodejs的新手。我没有在前1中看到响应,但我在前2中看到了。为什么?等待使用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) 
 }
});

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

node.js asynchronous async-await ecmascript-next
4个回答
94
投票

你应该只对返回Promise的东西进行await。在你开始使用asyncawait之前,我肯定会建议阅读Promises。您可以通过围绕request创建自己的包装函数来使这个示例工作,以使其返回一个promise,如下所示:

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而不是常规请求模块。


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

4
投票

正如@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);

但是:Kua zxsw指出


1
投票

尝试使用以下NPM包

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

node-fetch

希望它有效。

© www.soinside.com 2019 - 2024. All rights reserved.