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 相关文章推荐
js onpropertychange输入框 事件获取属性
Mar 26 Javascript
juqery 学习之六 CSS--css、位置、宽高
Feb 11 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
浅析C/C++,Java,PHP,JavaScript,Json数组、对象赋值时最后一个元素后面是否可以带逗号
Mar 22 Javascript
Javascript实现苹果悬浮虚拟按钮
Apr 10 Javascript
bootstrap——bootstrapTable实现隐藏列的示例
Jan 14 Javascript
基于JavaScript实现拖动滑块效果
Feb 16 Javascript
Angular 如何使用第三方库的方法
Apr 18 Javascript
JavaScript面向对象的程序设计(犯迷糊的小羊)
May 27 Javascript
动态内存分配导致影响Javascript性能的问题
Dec 18 Javascript
JS中自定义事件的使用与触发操作实例分析
Nov 01 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
浅谈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
php获取mysql版本的几种方法小结
2008/03/25 PHP
PHP正确解析UTF-8字符串技巧应用
2012/11/07 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP计算指定日期所在周的开始和结束日期的方法
2015/03/24 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
php cli配置文件问题分析
2015/10/15 PHP
php防止sql注入的方法详解
2017/02/20 PHP
php提取微信账单的有效信息
2018/10/01 PHP
Thinkphp5框架异常处理操作实例分析
2020/06/03 PHP
javascript下4个跨浏览器必备的函数
2010/03/07 Javascript
如何确保JavaScript的执行顺序 之实战篇
2011/03/03 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
JavaScript中的原型prototype完全解析
2016/05/10 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
node中koa中间件机制详解
2017/08/22 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
JS/jQuery实现简单的开关灯效果【案例】
2019/02/19 jQuery
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
node.js事件轮询机制原理知识点
2019/12/22 Javascript
JS实现小星星特效
2019/12/24 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[01:02:48]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 LGD vs OG
2018/04/02 DOTA
[05:11]TI9战队采访——VIRTUSPRO
2019/08/22 DOTA
详解python之协程gevent模块
2018/06/14 Python
对Python捕获控制台输出流的方法详解
2019/01/07 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
党员批评与自我批评
2014/02/12 职场文书
教师演讲稿开场白
2014/08/25 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
浅谈由position属性引申的css进阶讨论
2021/05/25 HTML / CSS
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL