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 document.createDocumentFragment()
Apr 04 Javascript
javascript 仿QQ滑动菜单效果代码
Sep 03 Javascript
仿猪八戒网左下角的文字滚动效果
Oct 28 Javascript
jquery 选择器引擎sizzle浅析
Feb 06 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
Feb 15 Javascript
使用javascript提交form表单方法汇总
Jun 25 Javascript
javascript检查浏览器是否已经启用XX功能
Jul 10 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
Mar 03 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
Aug 20 Javascript
详解nginx配置vue h5 history去除#号
Nov 09 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
Jan 29 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
snoopy PHP版的网络客户端提供本地下载
2008/04/15 PHP
通过具体程序来理解PHP里面的抽象类
2010/01/28 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
PHP Filter过滤器全面解析
2016/08/09 PHP
PHP xpath()函数讲解
2019/02/11 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
PHP函数积累总结
2019/03/19 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
基于Jquery与WebMethod投票功能实现代码
2011/01/19 Javascript
js FLASH幻灯片字符串中有连接符&的处理方法
2012/03/01 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
js实现把时间戳转换为yyyy-MM-dd hh:mm 格式(es6语法)
2017/12/28 Javascript
vue短信验证性能优化如何写入localstorage中
2018/04/25 Javascript
AngularJS 事件发布机制
2018/08/28 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
Python线性方程组求解运算示例
2018/01/17 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
2019/08/06 Python
Python测试模块doctest使用解析
2019/08/10 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
用python批量移动文件
2021/01/14 Python
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
公司财务自我评价分享
2013/12/17 职场文书
运动会广播稿20字
2014/02/18 职场文书
班级文化标语
2014/06/23 职场文书
自我工作评价范文
2015/03/06 职场文书
大学入学感言
2015/08/01 职场文书
python基础之函数的定义和调用
2021/10/24 Python
工厂无线对讲系统解决方案
2022/02/18 无线电