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 交通频道 作文范文 清正廉洁演讲稿 清正廉洁的演讲稿 记一次妙趣横生的作文课 励志歌曲《我真的很不错》:大声肯定自己 爱,是个美丽的约定 ◆◇丶2010、为自己而奋斗。 桃花,我另类的小闺蜜 浓浓父子情——《父与子》读后感 刚刚开始作文700字 描写春天的句子要短一点的 小学五年级作文450字:落日与火烧云 下雨的快乐作文150字 My dad's eyes 我生活在幸福中450字作文 四年级寒假趣事作文:一段回忆 初中初一作文550字:帮助 这一世我欠你下一生不离不弃(四) 大学生演讲稿 文明缔造和谐 父亲节送什么 如果,我能再做一次小学生 参观革命老区心得体会 爱得死心塌地的爱情短信 爱的水果糖 换糖老人500字 玩,对人不好作文300字 大学生体育赛事总结表彰座谈会发言稿 十七大入党思想汇报 隔河相望 2013学年入学新生入党申请书范文 流浪的星星读后感 情感倍数/的痛 十元钱 X村“三村四化”总体规划 我是一面不幸的墙 生死道 2014年信访局党支部工作报告 《红楼梦》读后感600字——浅评林黛玉 (090522周记)天下无贼作文600字 最伤感的经典语录:红尘往事,伤了多少人,痛了多少心? 鬼校【6】【上】 “讲正气 经典情诗100首 乡抗震救灾工作情况汇报 读后感《冰心集》750字 同恭夏日题寻真观李宽中秀才书院 小说《是对是错》之四十八、四十九 想占有你的人,虽然追求的时候千好万好(爱情语录) 我过了一把瘾季靖舒作文250字 调皮的蛋宝宝 安静下来,也许我们走得太急了

Copyright © 2016 phpStudy |