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 相关文章推荐
div移动 输入框不能输入的问题
Nov 19 Javascript
jquery图片上下tab切换效果
Mar 18 Javascript
javascript中不等于的代码是什么怎么写
Dec 29 Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
JQuery实现简单的图片滑动切换特效
Nov 22 Javascript
JS实现设置ff与ie元素绝对位置的方法
Mar 08 Javascript
Extjs让combobox写起来简洁又漂亮
Jan 05 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
微信小程序画布圆形进度条显示效果
Nov 17 Javascript
react 应用多入口配置及实践总结
Oct 17 Javascript
详解如何使用koa实现socket.io官网的例子
Nov 04 Javascript
vue实现文字加密功能
Sep 27 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
JavaScipt基本教程之前言
2008/01/16 Javascript
收集的一些Array及String原型对象的扩展实现代码
2010/12/05 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
2013/05/07 Javascript
js获取事件源及触发该事件的对象
2013/10/24 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
jquery插件qrcode在线生成二维码
2015/04/26 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
Vue项目中引入外部文件的方法(css、js、less)
2017/07/24 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
element-ui上传一张图片后隐藏上传按钮功能
2019/05/22 Javascript
微信小程序开发打开另一个小程序的实现方法
2020/05/17 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
在Django的通用视图中处理Context的方法
2015/07/21 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
深入解析Python中的线程同步方法
2016/06/14 Python
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
在pycharm中debug 实时查看数据操作(交互式)
2020/06/09 Python
python 解决pycharm运行py文件只有unittest选项的问题
2020/09/01 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
巴塞罗那观光通票:Barcelona Pass
2019/10/30 全球购物
客房主管岗位职责
2013/12/09 职场文书
应聘销售主管的求职信
2014/04/26 职场文书
校庆团日活动总结
2014/08/28 职场文书
怎样写家长意见
2015/06/04 职场文书
《我的伯父鲁迅先生》教学反思
2016/02/16 职场文书
解决Goland 同一个package中函数互相调用的问题
2021/05/06 Golang
简述Java中throw-throws异常抛出
2021/08/07 Java/Android