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


最近在项目中使用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修改响应结果实例代码,希望对大家有所帮助!



相关阅读:
Win10安装率高暴虐Win8!你就是第二个Vista
如何让安卓(Android)子控件超出父控件的范围显示
详细了解CSS中的class与id区别及用法
多个checkbox被选中时如何判断是否有自己想要的
Linux系统的电脑上调整屏幕亮度的方法
如何创建一个WinXP的域环境并将计算机加入到域中
《JavaScript高级编程》学习笔记之object和array引用类型
jquery+json实现数据二级联动的方法
node.js连接mongoDB数据库 快速搭建自己的web服务
PHP中开启gzip压缩的2种方法
win7电脑系怎么设置不睡眠、不自动黑屏?
详解PNG图片
Win10 10074最新预览版:Windows Defender有新家了
IOS如何替换电话号码中间4位为"-"符号
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 阜阳-沈丘 杭州东-锦州南 大连-嫩江 蚌埠-青铜峡 泰和-汕头 从江-贵阳北 新华屯-普兰店 银滩-海口 海城-缙云 延安-兰考 哈尔滨东-恒地营 团结-大扬气 吴桥-龙华 淮南-兰考 柳园-张家口南 兴义-漳州 安阳-梁平 北京-甘旗卡 甘旗卡-平原 平坝南-新化南 玉门-东海县 甘河-新帐房 马鞍山-鹰潭 怀柔-正定 商城-义乌 交城-镇安 沈阳北-贵溪 新沂-乌鲁木齐南 昌黎-明城 上虞-株洲 五龙背-北票南 赣州-蚌埠 公主岭-华蓥 无锡-马鞍山东 哈尔滨-绥棱 石桥子-泉阳 淄博-常州北 芦台-柳州 饶平-宁德 加格达奇-沟帮子 白涛-秀山 天水-喀什 青城山-成都 德安-莆田 羊场-马林 东至-镇江 临汾-赤壁 许昌-溆浦 黑井-师庄 西平-邢台 揭阳-韶关东 敦化-潍坊 昆明南-曲靖北 常州-万源 徐州-安庆西 葫芦岛北-石家庄北 桃山-南岔 广安-瑞金 景德镇-深圳 三门峡-公主岭 冷水江东-贵阳 奎山-青龙 铁岭-前进镇 郑州-延安 杜家-棋盘 赣州-杭州东 汕尾-于都 宣汉-呼和浩特东 云梦-资溪 明光-公主岭 鞍山-新开 石家庄北-葫芦岛 开通-扎赉诺尔西 光明-大乌苏 罗平-义乌 济南-泰安 长春-石岭 湘潭北-武义北 长春-辽阳 济南-金州 我是辽宁盘锦的,不知道大家谁开过腾翼C30这车到底怎么样啊,
从成都到泸州叙永,怎么坐车?
郑州可以买北京西到海口的票吗,有学生证这样的话还是可以半
苏州震泽镇到杭州怎么走
哈尔滨银行交医保费用本人去吗需要什么到那还需要填单子
宜昌公交_宜昌公交
从惠州坐车去澳门,请问应该如何乘车,坐到哪
济南到湖南列车火车票
广州列车站托运冰箱和空调到祁东要多少钱 有车票
从德阳到厦门火车列车线程,那位帅哥,给个详细的线程表嘛,我是
丹东发大水了 沈阳是不是也快了 听说今天把辽阳炸了保沈阳
徐州到鱼台的汽车票是多少有没有近期乘坐过的,我要知道确
上海南站到江西玉山的时刻表
临汾到杭州怎走汽车_临汾到杭州怎走火车
唐山207路早班在唐山发车是几点
莆田走高速到长乐机场
福州到厦门邮寄_福州到厦门邮寄
画栋朝飞南浦云
广州到连云港的列车票最便宜的要多少
青岛是否有新开的动车组车次
厦门到龙岩汽车闽FY1489电话
从韩城火车列车站怎么到陕西龙门煤化工有限责任公司
郑州晚上又到侯马的客车汽车吗
我要买2011年1月9号T63次的火车列车票,提前几天买
斗门白蕉车站有直达汽车到广州列车火车东站
从太原到沈阳的长途大客有几趟,都是几点发车
昆明装配电脑,到什么地方好
从郑州到北京几个小时
重庆北站到泸州 我坐K71次火车列车经重庆回泸州,到重庆北站的时
请帮我查一下PA145161408844快递到那里了

Copyright © 2016 phpStudy |