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 相关文章推荐
自写简单JS判断是否已经弹出页面
Oct 20 Javascript
jQuery 在光标定位的地方插入文字的插件
May 10 Javascript
jquery ui dialog实现弹窗特效的思路及代码
Aug 03 Javascript
使用js判断TextBox控件值改变然后出发事件
Mar 07 Javascript
推荐9款炫酷的基于jquery的页面特效
Dec 07 Javascript
jquery mobile 移动web(5)
Dec 20 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
May 09 Javascript
jQuery插件MovingBoxes实现左右滑动中间放大图片效果
Feb 28 Javascript
AngularJS页面带参跳转及参数解析操作示例
Jun 28 Javascript
浅谈javascript中的prototype和__proto__的理解
Apr 07 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
原生JS实现拖拽功能
Dec 16 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 array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
php中namespace use用法实例分析
2016/01/22 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
疯掉了,尽然有js写的操作系统
2007/04/23 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
js判断浏览器类型的方法
2013/08/07 Javascript
Bootstrap按钮下拉菜单组件详解
2016/05/10 Javascript
require.js配合插件text.js实现最简单的单页应用程序
2016/07/12 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
JavaScript中String对象的方法介绍
2017/01/04 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
js读取本地文件的实例
2017/12/22 Javascript
全面介绍vue 全家桶和项目实例
2017/12/27 Javascript
mockjs+vue页面直接展示数据的方法
2018/12/19 Javascript
Vue中JS动画与Velocity.js的结合使用
2019/02/13 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
Python中的元组介绍
2019/01/28 Python
详解python运行三种方式
2019/05/13 Python
python调用并链接MATLAB脚本详解
2019/07/05 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
Python的垃圾回收机制详解
2019/08/28 Python
图解python全局变量与局部变量相关知识
2019/11/02 Python
Python API len函数操作过程解析
2020/03/05 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
前台领班岗位职责
2013/12/04 职场文书
《王二小》教学反思
2014/02/27 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
授权委托书范本(单位)
2014/09/28 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
搞笑欢迎词大全
2015/09/30 职场文书
mysql的MVCC多版本并发控制的实现
2021/04/14 MySQL