使用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种方法相关推荐

  1. dva ajax请求,dva框架使用mock.js模拟数据 + fetch请求数据

    what DVA? Dva是基于Redux做了一层封装,对于React的state管理,有很多方案,我选择了轻量.简单的Dva. dva 可以很方便就使用mock.js进行数据的模拟. 只需要三步,即 ...

  2. node.js模拟qq漂流瓶

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) node.js模拟简易漂流瓶,页面有扔瓶子和捡瓶子的功能,一个瓶子只能被捡到一次,阅读完就置状态位, ...

  3. js循环发起ajax请求

    js循环发起ajax请求 工作中会遇到如下类似场景: 前端请求一个文章列表的接口A,A返回了所有的文章列表.而文章内容需要拿着A返回的每条Id去请求文章详情接口B. 这种情况下需要循环请求,因为aja ...

  4. Node.js~ioredis处理耗时请求时连接数瀑增

    关于redis连接数过高的解释 对于node.js开发环境里,使用传统的redis或者使用ioredis都是不错的选择,而在处理大数据请求程中,偶尔出现了连接池( redis服务端的最大可用连接数,默 ...

  5. php node 目录,node.js基于fs模块对系统文件及目录进行读写操作的方法详解

    本文主要介绍了node.js基于fs模块对系统文件及目录进行读写操作的方法,结合实例形式分析了nodejs使用fs模块针对文件与目录的读写.创建.删除等相关操作技巧,需要的朋友可以参考下. 如果要用这 ...

  6. 异步编程有哪几种方法来实现?

    这里是修真院前端小课堂,每篇分享文从 [背景介绍][知识剖析][常见问题][解决方案][编码实战][扩展思考][更多讨论][参考文献] 八个方面深度解析前端知识/技能,本篇分享的是: [异步编程有哪几 ...

  7. js判断wifi_使用JS在浏览器中判断当前网络连接状态的几种方法

    使用JS在浏览器中判断当前网络状态的几种方法如下: 1. navigator.onLine 2. ajax请求 3. 获取网络资源 4. bind() 1. navigator.onLine 通过na ...

  8. js计算数组中每个元素出现的次数(2种方法)

    js计算数组中每个元素出现的次数(2种方法) js动态生成唯一id Javascript生成全局唯一标识符(GUID,UUID)的方法

  9. 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...

    在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...

最新文章

  1. mysql创建表的时候显式申明存储引擎
  2. 计算机网络时延图,计算机网络中网站性能延迟加载图像的示例分析
  3. 游客显示的html代码,html5游客总数柱状图代码
  4. Python datetime astimezone()方法与示例
  5. ul li一行两个显示
  6. java hrows使用的解释_Android JNI学习之javah命令的正确使用(找了好半天才找到的,汉,网上好多说法都没用)...
  7. 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度
  8. STC学习:可振动感应的电子音乐
  9. HTML CSS设计与构建网站 ([美]达科特) PDF原版​
  10. 虚拟项目团队构建与管理
  11. gcc 中-O1 -O2 -O3 优化的原理
  12. ubuntu禁用smap
  13. java 进程 线程数量_如何查询一个进程下面的线程数(进程和线程区别)
  14. java字符串组合_Java实现abc字符串排列组合
  15. vlookup多条件的使用
  16. 5分钟使用Echarts轻松实现地图下钻
  17. 区块链-拜占庭将军问题介绍
  18. Android Data Recovery for Mac(安卓数据恢复软件)破解版安装
  19. 推荐一款强大的3D家装开源软件
  20. python import wx_python – 必须首先创建wx.app对象

热门文章

  1. CVPR2020人脸防伪检测挑战赛冠亚军论文解读(上篇)
  2. 高效的机器学习研究者,应该具备这 6 个习惯
  3. 关于自动驾驶汽车的7大误解
  4. 得分碾压人类的NLP系统诞生了,微软创CoQA挑战新纪录!
  5. SAP MM ME1M报表结果不科学?
  6. (已解决)(Jupyter notebook)中的tqdm进度条不是在一行更新并显示而是一直滚动往下输出
  7. 破解人工智能系统的四种攻击方法!
  8. 元宇宙深度研究报告:元宇宙是互联网的终极形态?
  9. 哈佛大学惊人发现:新冠对人类未来影响巨大!
  10. 人工智能写出第一篇文章:我真的没想要消灭你们,人类!