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 相关文章推荐
javascript动画效果类封装代码
Aug 28 Javascript
javascript 写的一个简单的timer
Jul 30 Javascript
JS(JQuery)操作Array的相关方法介绍
Feb 11 Javascript
javascript计时器详解
Feb 28 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
javascript中return,return true,return false三者的用法及区别
Nov 17 Javascript
Bootstrap表单布局样式源代码
Jul 04 Javascript
Bootstrap缩略图的创建方法
Mar 22 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
Jul 18 jQuery
JavaScript 面向对象基础简单示例
Oct 02 Javascript
Windows下安装 node 的版本控制工具 nvm
Feb 06 Javascript
解决vuex刷新数据消失问题
Nov 12 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
php基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
jquery ajax abort()的使用方法
2010/10/28 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
node.js下when.js 的异步编程实践
2014/12/03 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
跟我学习javascript创建对象(类)的8种方法
2015/11/20 Javascript
深入理解MVC中的时间js格式化
2016/05/19 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
input 禁止输入特殊字符的四种实现方式
2016/08/24 Javascript
JS判断输入的字符串是否是数字的方法(正则表达式)
2016/11/29 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
JS实现多物体运动的方法详解
2018/01/23 Javascript
jQuery实现菜单的显示和隐藏功能示例
2018/07/24 jQuery
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
JavaScript图像放大镜效果实现方法详解
2020/06/28 Javascript
[15:56]Heroes18_暗影萨满(完美)
2014/10/31 DOTA
[02:23]2016国际邀请赛中国区预选赛wings晋级之路
2016/06/29 DOTA
[36:29]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs TNC
2018/04/02 DOTA
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Pycharm修改python路径过程图解
2020/05/22 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
《有趣的发现》教学反思
2014/04/15 职场文书
广告设计专业毕业生自我鉴定
2014/09/27 职场文书
2015年学校后勤工作总结
2015/04/08 职场文书
求职信如何撰写?
2019/05/22 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
nginx之queue的具体使用
2022/06/28 Servers