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

use*_*286 38 asynchronous node.js async-await ecmascript-next

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

例1

 let res = await request(url)
 console.log(res);
 console.log(res.body);
Run Code Online (Sandbox Code Playgroud)

例2

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

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

saa*_*adq 111

你应该只await返回一个Promise的东西.在你开始async和之合作之前,我肯定会建议你阅读Promises await.您可以通过创建自己的包装函数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();
Run Code Online (Sandbox Code Playgroud)

编辑:或者,您可以查看使用请求承诺而不是常规请求模块.

  • 这应该是答案 (5认同)

dim*_*iax 18

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

码:

// 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)
        })
    })
Run Code Online (Sandbox Code Playgroud)

  • 你的意思是异步请求不是等待请求?对?https://www.npmjs.com/package/async-request (4认同)
  • @HMagdy 不,`await-request` 它是本地文件的文件名。 (2认同)

moz*_*mur 8

正如@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);
Run Code Online (Sandbox Code Playgroud)

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