Node.JS中使用async/await的正确请求
在我的程序中,我从另一个API模块对我的函数进行Node.JS中使用async/await的正确请求,node.js,rest,asynchronous,request,async-await,Node.js,Rest,Asynchronous,Request,Async Await,在我的程序中,我从另一个API模块对我的函数进行async调用: var info = await api.MyRequest(value); 模块代码: var request = require("request") module.exports.MyRequest = async function MyRequest(value) { var options = { uri: "http://some_url", method: "GET",
async
调用:
var info = await api.MyRequest(value);
模块代码:
var request = require("request")
module.exports.MyRequest = async function MyRequest(value) {
var options = {
uri: "http://some_url",
method: "GET",
qs: { // Query string like ?key=value&...
key : value
},
json: true
}
try {
var result = await request(options);
return result;
} catch (err) {
console.error(err);
}
}
执行立即返回,但是result
,因此info
包含请求对象和请求正文-info.body
类似key=value&…
,而不是必需的响应正文
我做错了什么?如何修复?对于
async
,什么是正确的request
用法,或者它只能在这里提到的承诺下正常工作:?下面的文章提到这是可能的:.您需要使用请求承诺
模块,而不是请求
模块或http.request()
await
适用于返回承诺的函数,而不适用于返回请求
对象并希望您使用回调或事件侦听器来了解何时完成操作的函数
请求承诺
模块支持与请求
模块相同的功能,但其中的异步函数返回承诺,因此您可以对它们使用.then()
或等待
,而不是请求
模块期望的回调
因此,请安装,然后更改:
var request = require("request");
为此:
const request = require("request-promise");
然后,您可以执行以下操作:
var result = await request(options);
在维护模式下编辑2020年1月-request()模块 仅供参考,
request
模块及其衍生产品如request promise
目前处于维护模式,不会积极开发以添加新功能。你可以阅读更多关于推理的内容。中有一个备选方案列表,并对每个备选方案进行了讨论
我一直在使用我自己,它从一开始就使用Promissions,支持许多与
request()
模块相同的选项,并且编程简单。非常确定您也可以执行以下操作。如果您需要的东西在默认情况下没有返回承诺,您可以通过新的承诺方法提供它。不过,上面的答案没有那么冗长
异步函数getBody(url){
常量选项={
url:url,
方法:“GET”,
};
//回报新的承诺
返回新承诺(功能(解决、拒绝){
//执行异步作业
获取(选项、函数(err、resp、body){
如果(错误){
拒绝(错误);
}否则{
决议(机构);
}
})
})
}我刚刚设法让它与异步/await一起工作。我将它包装在一个函数
promisifiedRequest
中,以返回一个promise
,该函数运行请求回调
,并根据错误
和响应
解析或拒绝它
const request = require('request');
const promisifiedRequest = function(options) {
return new Promise((resolve,reject) => {
request(options, (error, response, body) => {
if (response) {
return resolve(response);
}
if (error) {
return reject(error);
}
});
});
};
(async function() {
const options = {
url: 'https://www.google.com',
method: 'GET',
gzip: true,
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36'
}
};
let response = await promisifiedRequest(options);
console.log(response.headers);
console.log(response.body);
})();
由于
request promise
已被弃用,以下是不依赖于NPMrequest
包的其他选项Get
已经提到,但它取决于其他11个包,相反,只有1个依赖项(用于重定向)。其他一切都是在本机NodeJS包之上本机实现和构建的
下面是使用axios的相同示例:
const axios=require('axios'))
const response=wait axios.get(url)
const result=response.data
打字机脚本中的一行:
const{data}=wait axios.get(url)
对于不需要Cookie、重定向和重试等高级功能的简单情况,您可以使用本机http
/const https=require('https')
异步函数获取(url){
返回新承诺((解决、拒绝)=>{
const request=https.get(url,{timeout:1000},(res)=>{
如果(res.statusCode<200 | | res.statusCode>299){
返回拒绝(新错误(`HTTP状态代码${res.statusCode}`))
}
常量体=[]
res.on('data',(chunk)=>body.push(chunk))
res.on('结束',()=>{
const resString=Buffer.concat(body.toString)()
解析(Restring)
})
})
请求.on('error',(err)=>{
拒绝(错误)
})
请求时('超时',()=>{
请求销毁()
拒绝(新错误(“超时”)
})
})
}
const res=等待取数('https://...')
async
和wait
在nodejs 7最新版本中工作。因此,请确保您拥有最新版本的NodeJS7。有关更多信息,请参阅此链接@Aabid I have Node.js 8.4当异步在没有async关键字的情况下也可以正常工作时,异步的用途是什么?请原谅我的这些问题。你可以这样做,它会工作的,但是单元测试函数getBody(url)
变得非常困难。我只是通过艰苦的学习!对我来说,这是最好的回答谢谢@user3520261你的回答解决了我的大问题。