为啥等待不适用于节点请求模块?
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
。在开始使用 async
和 await
之前,我绝对会推荐阅读 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
用法:其中request
是require('./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)?