Node.js模拟发起http请求从异步转同步的5种方法
使用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()` 写法。
复制代码
第二种
使用模块 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 --> getSCasync function usebluebird(){let result = await request.getSC(url , {'auth' : {'user' : 'xx','pass' : 'xxx','sendImmediately' : 'false',}});console.log("result" , result);
}usebluebird()
复制代码
上面总结了5种使用方法,其实要说也不止5种了,大家根据自己需要来选择。
转载于:https://juejin.im/post/5b9b7e9a5188255c6140b9c0
Node.js模拟发起http请求从异步转同步的5种方法相关推荐
- dva ajax请求,dva框架使用mock.js模拟数据 + fetch请求数据
what DVA? Dva是基于Redux做了一层封装,对于React的state管理,有很多方案,我选择了轻量.简单的Dva. dva 可以很方便就使用mock.js进行数据的模拟. 只需要三步,即 ...
- node.js模拟qq漂流瓶
(文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...
- js循环发起ajax请求
js循环发起ajax请求 工作中会遇到如下类似场景: 前端请求一个文章列表的接口A,A返回了所有的文章列表.而文章内容需要拿着A返回的每条Id去请求文章详情接口B. 这种情况下需要循环请求,因为aja ...
- Node.js~ioredis处理耗时请求时连接数瀑增
关于redis连接数过高的解释 对于node.js开发环境里,使用传统的redis或者使用ioredis都是不错的选择,而在处理大数据请求程中,偶尔出现了连接池( redis服务端的最大可用连接数,默 ...
- php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解
本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...
- 异步编程有哪几种方法来实现?
这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [异步编程有哪几 ...
- js判断wifi_使用JS在浏览器中判断当前网络连接状态的几种方法
使用JS在浏览器中判断当前网络状态的几种方法如下: 1. navigator.onLine 2. ajax请求 3. 获取网络资源 4. bind() 1. navigator.onLine 通过na ...
- js计算数组中每个元素出现的次数(2种方法)
js计算数组中每个元素出现的次数(2种方法) js动态生成唯一id Javascript生成全局唯一标识符(GUID,UUID)的方法
- 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...
在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...
最新文章
- mysql创建表的时候显式申明存储引擎
- 计算机网络时延图,计算机网络中网站性能延迟加载图像的示例分析
- 游客显示的html代码,html5游客总数柱状图代码
- Python datetime astimezone()方法与示例
- ul li一行两个显示
- java hrows使用的解释_Android JNI学习之javah命令的正确使用(找了好半天才找到的,汉,网上好多说法都没用)...
- 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
- STC学习:可振动感应的电子音乐
- HTML CSS设计与构建网站 ([美]达科特) PDF原版​
- 虚拟项目团队构建与管理
- gcc 中-O1 -O2 -O3 优化的原理
- ubuntu禁用smap
- java 进程 线程数量_如何查询一个进程下面的线程数(进程和线程区别)
- java字符串组合_Java实现abc字符串排列组合
- vlookup多条件的使用
- 5分钟使用Echarts轻松实现地图下钻
- 区块链-拜占庭将军问题介绍
- Android Data Recovery for Mac(安卓数据恢复软件)破解版安装
- 推荐一款强大的3D家装开源软件
- python import wx_python – 必须首先创建wx.app对象