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 服务器 CMS SQL jQuery C# C++ java Android IOS oracle MongoDB PostgreSQL SQLite 交通频道 沧州-普洱 鸡西-海北 神木-凉山 龙岩-沈阳 桂林-临汾 南平-诸暨 益阳-郴州 常州-宁海 三亚-呼伦贝尔 安康-昌吉 宁波-十堰 益阳-鹤岗 如皋-百色 巴中-仙桃 鹤岗-信阳 厦门-遵化 泰州-长兴 平湖-宣城 周口-宁乡 鄂州-孝感 十堰-黄山 绵阳-日照 临沧-晋城 景德镇-玉林 江门-宁乡 衡阳-广安 温岭-马鞍山 吴忠-桐庐 漳州-武威 金昌-宜春 柳州-中山 张家港-鹤岗 宿迁-中山 阜阳-林芝 宁乡-十堰 曲阜-浏阳 泸州-苏州 海南-温州 海东-毕节 赤峰-西安 遵化-寿光 如皋-攀枝花 三门峡-长春 苏州-大丰 上饶-盐城 娄底-百色 新乡-九江 安庆-郴州 厦门-福州 十堰-抚州 凉山-咸阳 崇明-长春 连云港-六盘水 衡阳-海门 河源-安宁 潍坊-巩义 抚州-阿勒泰 苍南-莱西 嘉峪关-阳泉 扬中-石河子 绍兴-玉林 偃师-安顺 海门-湘潭 阳泉-新余 潍坊-长治 西宁-广州 淮北-吉林 三亚-大同 济南-恩施 抚顺-潍坊 张掖-鹤岗 三亚-许昌 嘉峪关-本溪 合肥-吉林 阿里-那曲 阿坝-凉山 郴州-泸州 徐州-偃师 东阳-石家庄 遵义-瓦房店 绥中-铁力 咸宁北-苏州北 嘉兴南-韶关 岳阳-淄博 晏城-静海 禹城-锦州南 溧水-金华 大杨树东-中和 蓬安-宁波 常州-北戴河 开通-山海关 宝鸡-定西 锦州-花园 达家沟-新立镇 子长-固始 荆门-乌鲁木齐 恩施-上海南 洛阳-临泽 李石寨-双河镇 唐山北-辽源 霸州西-郑州东 绥中-南岔 安陆-金华 南通-洋河 淄博-盘锦北 金华-鄂州 张桥-罗山 唐山北-南岔 秦皇岛-祁县 昆明南-苏州北 南平北-廊坊 中卫-察素齐 合川-郑州东 石桥子-荒沟西 弥勒-富宁 枣庄西-固镇 铁岭西-石家庄 鄂尔多斯-信阳 衡水-盘锦北 邢台-六盘水 瓦拉干-大乌苏 汉中-鲁山 清涧县-富县东 信阳-厦门 沈阳-深井子 下马塘-兴隆镇 汉口-兴国 沈阳北-沟帮子 安图-草市 遂宁-三门峡西 洛阳-虢镇 衡水-绵阳 抚松-三道湖 广州-张家口南 呼和浩特-天津 富拉尔基-大兴 开原-丹东 土贵乌拉-红砂坝 绍兴-龙游 龙岩-呼和浩特东 三门峡-青田 安康-襄阳东 青岛北-沈阳 东台-栟茶 鹰潭-天津西 榆次-沁县 苇河-平山 松江-余姚 天柱山-深圳西 宜宾-义乌 蔡家坡-焦作 蓝村-德清西 郁南-南宁西 汝州-沈丘 兰考南-昆明南 普兰店-通化 钟家村-绥德 运城北-西安北 枣强-武夷山 驻马店-义乌

Copyright © 2016 phpStudy |