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 相关文章推荐
理解JSON:3分钟课程
Oct 28 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
Jun 24 Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 Javascript
jQuery的animate函数学习记录
Aug 08 Javascript
jquery中push()的用法(数组添加元素)
Nov 25 Javascript
AngularJS学习笔记之依赖注入详解
May 16 Javascript
javascript 单例模式详解及简单实例
Feb 14 Javascript
Bootstrap BootstrapDialog使用详解
Feb 17 Javascript
关闭Vue计算属性自带的缓存功能方法
Mar 02 Javascript
个人小程序接入支付解决方案
May 23 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
Sep 20 Javascript
vue如何使用async、await实现同步请求
Dec 09 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 简单数组排序实现代码
2009/08/05 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
关于JavaScript的一些看法
2009/05/27 Javascript
js函数setTimeout延迟执行的简单介绍
2013/07/17 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
JS+CSS实现自动改变切换方向图片幻灯切换效果的方法
2015/03/02 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
BootStrap实现鼠标悬停下拉列表功能
2017/02/17 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
webpack4 处理SCSS的方法示例
2018/09/03 Javascript
element UI upload组件上传附件格式限制方法
2018/09/04 Javascript
element的el-table中记录滚动条位置的示例代码
2019/11/06 Javascript
python同时遍历数组的索引和值的实例
2018/11/15 Python
Python爬虫设置代理IP(图文)
2018/12/23 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
使用Python实现牛顿法求极值
2020/02/10 Python
PyQt5.6+pycharm配置以及pyinstaller生成exe(小白教程)
2020/06/02 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
市场营销大学生职业规划书
2014/02/25 职场文书
企业文化建设实施方案
2014/03/22 职场文书
意向协议书范本
2014/04/23 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
歌咏比赛主持词
2015/06/29 职场文书
Mysql - 常用函数 每天积极向上
2021/04/05 MySQL
html+css实现分层金字塔的实例
2021/06/02 HTML / CSS
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
Redis基本数据类型List常用操作命令
2022/06/01 Redis