Node.js模拟发起http请求从异步转同步的5种用法


Posted in Javascript onSeptember 26, 2018

使用 Node.js 模拟发起 http 请求很常用的,但是由于 Node 模块(原生和第三方库)提供里面的方法都是异步,对于很多场景下应用很麻烦,不如同步来的方便。下面总结了几个常见的库 API 从异步转同步的几种方法。模块有: request , request-promise , request-promise-native , request-promise-any

PS: Node的版本>=8.0.0 为了使用 Async / Await PS: 这里加入 auth 字段是为了需要用户名和密码登录的应用的请求 ,比如 rabbitmq ,不需要登录的页面可以去掉这个参数。

第一种

使用原生模块 util , 利用其 promisify API , 代码示例如下:

const request = require('request');
const util = require('util');
var url = "https://www.baidu.com/";
const getPromise = util.promisify(request.get);
// PS: 这里加入auth 字段是为了需要用户名和密码登录的应用的请求 ,比如rabbitmq ,不需要登录的页面可以去掉这个参数。
//1: 原生写法 无auth 参数
getPromise(url).then((value)=>{
 console.log("value" , value );
}).catch((err)=>{
 console.log("err" , err );
});
//2: 原生写法 有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 。
async function handle(){
 let result = await getPromise(url , {'auth' : {
  'user' : 'xx',
  'pass' : 'xx',
  'sendImmediately' : 'false',
 }});
 // 可以加入 try catch 捕获异常 也可以加 .catch()
 console.log("result" , result.);
}
handle();

PS: `auth` 参数的用法参考[链接][1]  , 在异步变同步中 不能使用  `request.get().auth()` 写法。

第二种

// post 示例 
const rpn = require('request-promise-native');
var url = "https://www.baidu.com/";
async function useRequestPromiseNative(){
 let options = {
  method: 'POST',
  uri: url,
  body: { // 这里定义你的body参数
  }
  json: true, // 这个看你的参数而定
  };
 let rpnbody = await rpn(options);  
 
 console.log("rpnbody" , rpnbody );
}
useRequestPromiseNative();

使用模块 request-promise-native , request-promise-native 是使用 native Promise 写的,查看源码可以看到继承自 Request 模块 , 代码示例如下:

// 不再写 原生示例 then()链的那种,参考第一个示例即可
//get 请求示例 
const rpn = require('request-promise-native'); 
var url = "https://www.baidu.com/";
async function useRequestPromiseNative(){
 // options 里面的参数可以去看request的源码 查看其index.d.ts 文件里面的 interface CoreOptions 里面有所有的参数。
 let options = {
  method: 'GET',
  uri: url,
  auth : {
   'user' : 'xx',
   'pass' : 'xx',
   'sendImmediately' : 'false',
  }
  };
 let rpnbody = await rpn(options);  
 
 console.log("rpnbody" , rpnbody );
}

useRequestPromiseNative();

// post 示例 
const rpn = require('request-promise-native');
var url = "https://www.baidu.com/";
async function useRequestPromiseNative(){
 let options = {
  method: 'POST',
  uri: url,
  body: { // 这里定义你的body参数
  }
  json: true, // 这个看你的参数而定
  };
 let rpnbody = await rpn(options);  
 
 console.log("rpnbody" , rpnbody );
}
useRequestPromiseNative();

第三种

使用模块 request-promise , request-promise 是基于 bluebird 写的, 查看源码可以看到继承自 Request 模块 , 代码示例如下:

// 不再写post 示例
const rp = require('request-promise');
var url = "https://www.baidu.com/";
async function useRequestPromise(){
 let options = {
  method: 'GET',
  uri: url,
  auth : {  //可以拿掉
   'user' : 'xx',
   'pass' : 'xx',
   'sendImmediately' : 'false',
  }
  };
 let rpbody = await rp(options);  
 console.log("rpnbody" , rpbody );
}
useRequestPromise();

第四种

使用模块 request-promise-any , request-promise-any 也是基于 request 写的, 代码示例如下:

// 不再写post 示例
const rpa = require('request-promise-any');
var url = "https://www.baidu.com/";
async function useRequestPromiseAny(){
 let options = {
  method: 'GET',
  uri: url,
  auth : {
   'user' : 'xx',
   'pass' : 'xx',
   'sendImmediately' : 'false',
  }
  };
 let rpabody = await rpa(options);  
 console.log("rpabody" , rpabody );
}
useRequestPromiseAny();

第五种

使用模块 bluebird , 利用其 promisifyAll API 转成 Promise , 代码示例如下:

const Promise = require('bluebird');
const request = require('request');
var url = "https://www.baidu.com/";
Promise.promisifyAll(request, { suffix: 'SC' }); //suffix 自定义 get --> getSC
async function usebluebird(){
 let result = await request.getSC(url , {'auth' : {
  'user' : 'xx',
  'pass' : 'xxx',
  'sendImmediately' : 'false',
 }});
 console.log("result" , result);
}
usebluebird()

总结

以上所述是小编给大家介绍的Node.js模拟发起http请求从异步转同步的5种用法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
innerText和innerHTML 一些问题分析
May 18 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 Javascript
JS批量修改PS中图层名称的方法
Jan 26 Javascript
javascript随机之洗牌算法深入分析
Jun 07 Javascript
Javascript基础教程之if条件语句
Jan 18 Javascript
canvas学习之API整理笔记(一)
Dec 29 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
Angular排序实例详解
Jun 28 Javascript
使用vuepress搭建静态博客的示例代码
Feb 14 Javascript
Node.js开发之套接字(socket)编程入门示例
Nov 05 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
Jul 21 Javascript
js实现点击烟花特效
Oct 14 Javascript
在vue中获取token,并将token写进header的方法
Sep 26 #Javascript
基于axios 解决跨域cookie丢失的问题
Sep 26 #Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
Sep 26 #Javascript
基于JavaScript实现一个简单的Vue
Sep 26 #Javascript
微信小程序授权登录及解密unionId出错的方法
Sep 26 #Javascript
vue根据进入的路由进行原路返回的方法
Sep 26 #Javascript
vue-router之nuxt动态路由设置的两种方法小结
Sep 26 #Javascript
You might like
跟我学Laravel之请求(Request)的生命周期
2014/10/15 PHP
PHP封装的多文件上传类实例与用法详解
2017/02/07 PHP
php+mysql+jquery实现日历签到功能
2017/02/27 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
Javascript new关键字的玄机 以及其它
2010/08/25 Javascript
利用js 进行输入框自动匹配字符的小例子
2013/06/29 Javascript
JS 获取浏览器和屏幕宽高等信息的实现思路及代码
2013/07/31 Javascript
httpclient模拟登陆具体实现(使用js设置cookie)
2013/12/11 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
2015/12/28 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
静态页面实现 include 引入公用代码的示例
2017/09/25 Javascript
浅谈 Vue 项目优化的方法
2017/12/16 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
2020/02/09 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
Python3实现的腾讯微博自动发帖小工具
2013/11/11 Python
详解Python中的正则表达式的用法
2015/04/09 Python
Java Web开发过程中登陆模块的验证码的实现方式总结
2016/05/25 Python
对Python3 序列解包详解
2019/02/16 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
逼真的HTML5树叶飘落动画
2016/03/01 HTML / CSS
香港零食网购:上仓胃子
2020/06/08 全球购物
小学教师的自我评价范例
2013/10/31 职场文书
婚纱摄影师求职信范文
2014/04/17 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python