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 相关文章推荐
某页码显示的helper 少量调整,另附js版
Sep 12 Javascript
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
May 24 Javascript
用innerhtml提高页面打开速度的方法
Aug 02 Javascript
jQuery 获取浏览器所在的IP地址的小例子
Nov 08 Javascript
基于Jquery制作图片文字排版预览效果附源码下载
Nov 18 Javascript
jquery实现简单的banner轮播效果【实例】
Mar 30 Javascript
老生常谈JavaScript 函数表达式
Sep 01 Javascript
AngularJS  双向数据绑定详解简单实例
Oct 20 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
Feb 10 Javascript
CKEditor4配置与开发详细中文说明文档
Oct 08 Javascript
实用的Vue开发技巧
May 30 Javascript
微信小程序分包加载代码实现方法详解
Sep 23 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与SQL注入攻击防范小技巧
2011/09/16 PHP
php获得用户ip地址的比较不错的方法
2014/02/08 PHP
PHP中使用Imagick实现各种图片效果实例
2015/01/21 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
js的写法基础分析
2011/01/17 Javascript
jQuery操作Select的Option上下移动及移除添加等等
2013/11/18 Javascript
jquery选择checked在ie8普通模式下的问题
2014/02/12 Javascript
JavaScript常用字符串与数组扩展函数小结
2016/04/24 Javascript
Backbone View 之间通信的三种方式
2016/08/09 Javascript
Vue.js学习示例分享
2017/02/05 Javascript
基于Vue实现tab栏切换内容不断实时刷新数据功能
2017/04/13 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
ExtJs整合Echarts的示例代码
2018/02/27 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
TensorFlow实现Logistic回归
2018/09/07 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
python实现flappy bird小游戏
2018/12/24 Python
对django后台admin下拉框进行过滤的实例
2019/07/26 Python
pytorch 改变tensor尺寸的实现
2020/01/03 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
销售员自我评价怎么写
2013/09/19 职场文书
计算机专业毕业生推荐信
2013/11/25 职场文书
物业公司采购员岗位职责
2013/12/31 职场文书
2014年保密工作总结
2014/11/22 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
vue实现可拖拽的dialog弹框
2021/05/13 Vue.js