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 交通频道 作文范文 邮政营业实习心得体会 关东大先生经典台词,赵本山台词部分 特殊的面试 关于完善电子商务信用体系的思考 责任——人生的红绿灯 踢足球是那么美好 2015年机关单位党支部工作计划 好女人是男人的学校。好女人却希望这个好学生永远不要毕业 友谊杂谈 夕阳下的变奏作文350字 怎样写小学生评语 绿叶舞 你以为看到了爱情,说到底不过是命运 外包加工合同 勤劳未必是美德 慈母颂 为什么惩罚我 小猴送桃子作文200字 邮政银行半年工作 总结 读,品,悟作文350字 小学六年级作文350字:读书感受和经历 初中初一作文750字:最后三天 瑞士私立中学为什么最贵 大队委员的“工作记”_六年级周记 牙膏的爱情 猫眼看上海 观《毛泽东的故事》有感作文700字 [自然-初一]春雨作文400字 ..永恒的回忆『情系同学录』(图文)作文900字 2015知识竞赛活动总结 初中初二作文800字:电脑故障第六天 最完整的商品房购房合同范本 农业环境审计设想 山一层,水一程 我学会了溜冰450字 卖手帕 商务日语毕业生面试自我介绍 高三家长该为孩子做些什么?_高三励志 记一件后悔的事 饭店简单辞职报告怎么写 最新学生世界环境日演讲稿(优秀) 留住那温馨记忆的片段 让女友担惊受怕的检讨书 4月专业技术工作总结范文 一年级作文 冬雪飘飘,梅香袅袅 我开始过龟式屌丝生活 地税局副局长科学发展观调研报告 曲儿 娘家2.17的一场大火 小三被发现了

Copyright © 2016 phpStudy |