【问题标题】:Why await is not working for node request module?为什么等待不适用于节点请求模块?
【发布时间】:2016-11-20 13:09:06
【问题描述】:

我是 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 调用中工作。但它不适用于请求调用。为什么?

【问题讨论】:

  • 仅供参考,async/await 不是 ES7 的一部分。这仍然只是一个建议。
  • 查看我的回答here。此外,this 也很有帮助。

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


【解决方案1】:

你应该只在返回 Promise 的东西上 await。在开始使用 asyncawait 之前,我绝对会推荐阅读 Promises。您可以通过围绕 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();

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

【讨论】:

  • 这应该是答案
  • 使用promisify from util怎么样?
  • 真的很有帮助。
  • request-promise 从那时起已被弃用
  • 感谢 j-chan,我根据您的评论更新了答案。
【解决方案2】:

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

【讨论】:

  • 你的意思是异步请求而不是等待请求?正确的? npmjs.com/package/async-request
  • @HMagdy no, await-request 这是本地文件的文件名。
  • 啊哈,明白了
【解决方案3】:

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

【讨论】:

  • 这正是我需要的 lambda —— 简单,除了 Node 不需要任何东西
【解决方案4】:

试试下面的 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);
          }

希望它有效。

【讨论】:

    猜你喜欢
    • 2018-06-19
    • 2015-04-10
    • 2020-06-08
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多