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 相关文章推荐
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
关于图片按比例自适应缩放的js代码
Oct 30 Javascript
js数组的操作详解
Mar 27 Javascript
JS函数重载的解决方案
May 13 Javascript
JavaScript中的方法调用详细介绍
Dec 30 Javascript
JavaScript匿名函数之模仿块级作用域
Dec 12 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
Feb 26 Javascript
JS获取IMG图片高宽的简单实例
May 17 Javascript
浅析jQuery中使用$所引发的问题
May 29 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 Javascript
vue实现路由不变的情况下,刷新页面操作示例
Feb 02 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
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
如何修改yii2.0自带的user表为其它的表
2017/08/01 PHP
Web版彷 Visual Studio 2003 颜色选择器
2007/01/09 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
jQuery在header中设置请求信息的方法
2017/03/06 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
underscore之Chaining_动力节点Java学院整理
2017/07/10 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
js实现简单掷骰子效果
2019/10/24 Javascript
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
python查找指定具有相同内容文件的方法
2015/06/28 Python
python2.7安装图文教程
2018/03/13 Python
Django contenttypes 框架详解(小结)
2018/08/13 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
set在python里的含义和用法
2019/06/24 Python
python中使用while循环的实例
2019/08/05 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
关于Keras模型可视化教程及关键问题的解决
2020/01/24 Python
Python IDLE或shell中切换路径的操作
2020/03/09 Python
python3 使用traceback定位异常实例
2020/03/09 Python
python如何安装下载后的模块
2020/07/03 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
建筑安全生产责任书
2014/07/22 职场文书
教师工作决心书
2015/02/04 职场文书
2015年信访工作总结
2015/04/07 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书