为啥等待不适用于节点请求模块?

Posted

技术标签:

【中文标题】为啥等待不适用于节点请求模块?【英文标题】: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 也很有帮助。 【参考方案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);
          

希望它有效。

【讨论】:

以上是关于为啥等待不适用于节点请求模块?的主要内容,如果未能解决你的问题,请参考以下文章

GET 请求适用于 Postman,但为啥它不适用于 ReactJS fetch?

为啥 CORS 适用于 API 请求,但不适用于我的 Nginx 配置中的媒体文件(例如 mp4、webm)?

邮递员原始数据有效,但表单数据不适用于节点中的 POST 请求

NodeJS POST方法不适用于请求模块

如何正确编码为啥使用节点请求模块的表情符号?

在 IIS7 URL 重写模块中,我可以在重定向规则中指定不适用于 http-post 请求吗?