Node.js模拟从异步到同步发起http请求的5种方式很多场景下应用起来很麻烦,还不如同步方便。下面总结几种常见的库API异步转同步的几种方式。模块包括:request,request-promise,request-promise-native,request-promise-anyPS:Nodeversion>=8.0.0为了使用Async/AwaitPS:这里为需要用户名和密码的应用添加auth字段login请求,比如rabbitmq,不需要login的页面可以去掉这个参数。第一个使用本机模块util并使用其promisifyAPI。代码示例如下:constrequest=require('request');constutil=require('util');varurl="https://www.baidu.com/";constgetPromise=util.promisify(request.get);//PS:这里添加了auth字段,用于需要用户名密码登录的应用的请求,比如rabbitmq,不需要登录的页面可以去掉这个参数。//1:没有auth参数的原生写法getPromise(url).then((value)=>{console.log("value",value);}).catch((err)=>{console.log("err",err);});//2:native写法有auth参数getPromise(url,{'auth':{'user':'xx','pass':'xx','sendImmediately':'false',}}).then((value)=>{console.log("value",value);}).catch((err)=>{console.log("err",err);});//async/await的第二种写法//我个人比较推荐使用这个,只用util和request。asyncfunctionhandle(){letresult=awaitgetPromise(url,{'auth':{'user':'xx','pass':'xx','sendImmediately':'false',}});//可以加trycatch捕获异常,也可以加.catch()console.log("result",result.);}handle();PS:的用法参考[链接][1]`auth`参数,以及从异步更改为同步`request.get().auth()`不能在.第二种是使用模块request-promise-native。request-promise-native是使用原生Promise编写的。查看源码可以看到它继承自Request模块。代码示例如下://不再写nativeexamplethen()chain类,直接参考第一个例子//getrequestexampleconstrpn=require('request-promise-native');varurl="https://www.baidu.com/";asyncfunctionuseRequestPromiseNative(){//options中的参数,可以去请求源码中查看其index.d中的接口CoreOptions.ts文件。里面有所有的参数。letoptions={method:'GET',uri:url,auth:{'user':'xx','pass':'xx','sendImmediately':'false',}};让rpnbody=awaitrpn(选项);console.log("rpnbody",rpnbody);}useRequestPromiseNative();//postexampleconstrpn=require('request-promise-native');varurl="https://www.baidu.com/";asyncfunctionuseRequestPromiseNative(){letoptions={method:'POST',uri:url,body:{//在这里定义你的body参数}json:true,//这取决于你的参数};让rpnbody=awaitrpn(选项);console.log("rpnbody",rpnbody);}useRequestPromiseNative();第三种使用模块request-promise,request-promise是基于bluebird写的,可以看到是继承自Request模块,代码示例如下://不再写postexampleconstrp=require('request-promise');varurl="https://www.baidu.com/";asyncfunctionuseRequestPromise(){letoptions={method:'GET',uri:url,auth:{//'user':'xx','pass':'xx','sendImmediately':'false',}};letrpbody=awaitrp(options);console.log("rpnbody",rpbody);}useRequestPromise();第四种使用模块request-promise-any,request-promise-any也是基于request写的,代码示例如下://不再写postexampleconstrpa=require('request-promise-any');varurl="https://www.baidu.com/";asyncfunctionuseRequestPromiseAny(){letoptions={method:'GET',uri:url,auth:{'user':'xx','通过':'xx','立即发送':'假',}};让rpabody=等待rpa(选项);console.log("rpabody",rpabody);}useRequestPromiseAny();第五个使用模块bluebird,并使用其promisifyAllAPI将其转换为Promise。代码示例如下:constPromise=require('bluebird');constrequest=require('请求');varurl="https://www.baidu.com/";Promise.promisifyAll(request,{suffix:'SC'});//后缀自定义get-->getSCasync函数usebluebird(){letresult=awaitrequest.getSC(url,{'auth':{'user':'xx','pass':'xxx','sendImmediately':'false',}});console.log("result",result);}usebluebird()上面总结了5种使用方法,其实不止5种,大家可以根据自己的需要选择
