node-http-proxy修改响应结果实例代码


Posted in Javascript onJune 06, 2016

最近在项目中使用node-http-proxy遇到需要修改代理服务器响应结果需求,该库已提供修改响应格式为html的方案:Harmon,而项目中返回格式统一为json,使用它感觉太笨重了,所以自己写了个可解析和修改json格式的库,

期间也遇到了之前未关注的问题:http传输编码、node流的相关处理。下面是实现代码:

var zlib = require('zlib');
var concatStream = require('concat-stream');
/**
* Modify the response of json
* @param res {Response} The http response
* @param contentEncoding {String} The http header content-encoding: gzip/deflate
* @param callback {Function} Custom modified logic
*/
module.exports = function modifyResponse(res, contentEncoding, callback) {
var unzip, zip;
// Now only deal with the gzip and deflate content-encoding.
if (contentEncoding === 'gzip') {
unzip = zlib.Gunzip();
zip = zlib.Gzip();
} else if (contentEncoding === 'deflate') {
unzip = zlib.Inflate();
zip = zlib.Deflate();
}
// The cache response method can be called after the modification.
var _write = res.write;
var _end = res.end;
if (unzip) {
unzip.on('error', function (e) {
console.log('Unzip error: ', e);
_end.call(res);
});
} else {
console.log('Not supported content-encoding: ' + contentEncoding);
return;
}
// The rewrite response method is replaced by unzip stream.
res.write = function (data) {
unzip.write(data);
};
res.end = function (data) {
unzip.end(data);
};
// Concat the unzip stream.
var concatWrite = concatStream(function (data) {
var body;
try {
body = JSON.parse(data.toString());
} catch (e) {
body = data.toString();
console.log('JSON.parse error:', e);
}
// Custom modified logic
if (typeof callback === 'function') {
body = callback(body);
}
// Converts the JSON to buffer.
body = new Buffer(JSON.stringify(body));
// Call the response method and recover the content-encoding.
zip.on('data', function (chunk) {
_write.call(res, chunk);
});
zip.on('end', function () {
_end.call(res);
});
zip.write(body);
zip.end();
});
unzip.pipe(concatWrite);
};

项目地址:node-http-proxy-json,欢迎大家试用提意见,同时不要吝啬Star。

在该库的实现过程中越发觉得理论知识的重要性,所谓理论是行动的先导,之前都是使用第三方库,也没去关心一些底层的细节处理。

后面有空一定要多看看底层的实现,否则遇到难搞问题就卡住了。

以上所述是小编给大家介绍的node-http-proxy修改响应结果实例代码,希望对大家有所帮助!

Javascript 相关文章推荐
仿163填写邮件地址自动显示下拉(无优化)
Nov 05 Javascript
ExtJs事件机制基本代码模型和流程解析
Oct 24 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
JQuery select控件的相关操作实现代码
Sep 14 Javascript
javascript搜索框效果实现方法
May 14 Javascript
点评js异步加载的4种方式
Dec 22 Javascript
教你一步步用jQyery实现轮播器
Dec 18 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
垃圾回收器的相关知识点总结
May 13 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 Javascript
基于jQuery的时间戳与日期间的转化
Jun 21 jQuery
浅谈一个webpack构建速度优化误区
Jun 24 Javascript
浅谈bootstrap源码分析之tab(选项卡)
Jun 06 #Javascript
浅谈bootstrap源码分析之scrollspy(滚动侦听)
Jun 06 #Javascript
jquery插件方式实现table查询功能的简单实例
Jun 06 #Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
Jun 06 #Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
Jun 06 #Javascript
JavaScript 数组中最大最小值
Jun 05 #Javascript
使用three.js 画渐变的直线
Jun 05 #Javascript
You might like
web方式ftp
2006/10/09 PHP
PHP5.4中json_encode中文转码的变化小结
2013/01/30 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
php 魔术方法详解
2014/11/11 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题
2007/01/09 Javascript
对google个性主页的拖拽效果的js的完整注释[转]
2007/04/10 Javascript
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
JavaScript 一行代码,轻松搞定浮动快捷留言-V2升级版
2010/04/02 Javascript
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
Vue项目添加动态浏览器头部title的方法
2018/07/11 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
vue项目移动端实现ip输入框问题
2019/03/19 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
2020/09/17 Javascript
vue使用transition组件动画效果的实例代码
2021/01/28 Vue.js
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
利用Python绘制数据的瀑布图的教程
2015/04/07 Python
python 调用HBase的简单实例
2016/12/18 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
基于python二叉树的构造和打印例子
2019/08/09 Python
解决pycharm编辑区显示yaml文件层级结构遇中文乱码问题
2020/04/27 Python
python和js交互调用的方法
2020/06/23 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
戴尔马来西亚官网:Dell Malaysia
2020/05/02 全球购物
改进工作作风心得体会
2016/01/23 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python