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 相关文章推荐
提高网站信任度的技巧
Oct 17 Javascript
javascript使用isNaN()函数判断变量是否为数字
Sep 21 Javascript
jQuery Validate初步体验(一)
Dec 12 Javascript
功能强大的Bootstrap效果展示(二)
Aug 03 Javascript
webpack配置文件和常用配置项介绍
Apr 28 Javascript
Angular.Js中ng-include指令的使用与实现
May 07 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
基于ajax和jsonp的原生封装(实例)
Oct 16 Javascript
bootstrap与pagehelper实现分页效果
Dec 29 Javascript
详解vue项目中实现图片裁剪功能
Jun 07 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
将数组写入txt文件 var_export
2009/04/21 PHP
PHP 类相关函数的使用详解
2013/05/10 PHP
zf框架的数据库追踪器使用示例
2014/03/13 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Prototype中dom对象方法汇总
2008/09/17 Javascript
学习ExtJS fit布局使用说明
2009/10/08 Javascript
JavaScript iframe的相互操作浅析
2009/10/14 Javascript
javascript 闭包
2011/09/15 Javascript
js中数组(Array)的排序(sort)注意事项说明
2014/01/24 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
JavaScript中的类与实例实现方法
2015/01/23 Javascript
Javascript中的getUTCHours()方法使用详解
2015/06/10 Javascript
Ionic如何创建APP项目
2016/06/03 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
五步轻松实现zTree的使用
2017/11/01 Javascript
Vue.JS项目中5个经典Vuex插件
2017/11/28 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
2018/09/04 Javascript
微信公众平台获取access_token的方法步骤
2019/03/29 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
基于Vue实现微前端的示例代码
2020/04/24 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
2020/08/12 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
python 函数嵌套及多函数共同运行知识点讲解
2020/03/03 Python
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
水果花束:Fruit Bouquets
2017/12/20 全球购物
Carter’s官方旗舰店:美国受欢迎的婴童服装品牌
2018/01/21 全球购物
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
竞聘医务工作人员的自我评价分享
2013/11/04 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
解析Redis Cluster原理
2021/06/21 Redis