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 相关文章推荐
ExtJS 2.0实用简明教程 之ExtJS版的Hello
Apr 29 Javascript
javascript对象之内置对象Math使用方法
Apr 16 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
Jun 28 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
javascript淘宝主图放大镜功能
Oct 20 Javascript
基于vuejs实现一个todolist项目
Apr 11 Javascript
Thinkjs3新手入门之添加一个新的页面
Dec 06 Javascript
基于three.js编写的一个项目类示例代码
Jan 05 Javascript
关于axios如何全局注册浅析
Jan 14 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
bootstrap-table后端分页功能完整实例
Jun 01 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
在php和MySql中计算时间差的方法
2011/04/22 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
php单例模式实现方法分析
2015/03/14 PHP
Linux php 中文乱码的快速解决方法
2016/05/13 PHP
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
2012/12/19 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
微信小程序实现列表页的点赞和取消点赞功能
2018/11/02 Javascript
JavaScript如何把两个数组对象合并过程解析
2019/10/10 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[01:05:29]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第二场 1月24日
2021/03/11 DOTA
用Python将一个列表分割成小列表的实例讲解
2018/07/02 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
python的re模块使用方法详解
2019/07/26 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
俄罗斯便宜的在线服装商店:GroupPrice
2020/04/10 全球购物
安全生产汇报材料
2014/02/17 职场文书
酒店秘书求职信范文
2014/02/17 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
教师三严三实对照检查材料
2014/09/25 职场文书
秋冬农业生产标语
2014/10/09 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
财产保全担保书
2015/01/20 职场文书
幼儿园教师师德表现自我评价
2015/03/05 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python