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 相关文章推荐
event.srcElement 用法笔记e.target
Dec 18 Javascript
js jquery数组介绍
Jul 15 Javascript
node.js中的fs.symlinkSync方法使用说明
Dec 15 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
IE浏览器下PNG相关功能
Jul 05 Javascript
详解ES6之用let声明变量以及let loop机制
Jul 15 Javascript
vue-router 路由基础的详解
Oct 17 Javascript
基于vue-element组件实现音乐播放器功能
May 06 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
Apr 11 Javascript
JS中的一些常用的函数式编程术语
Jun 15 Javascript
微信小程序使用蓝牙小插件
Sep 23 Javascript
浅谈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基础学习笔记
2007/03/18 PHP
《PHP编程最快明白》第八讲:php启发和小结
2010/11/01 PHP
Ubuntu下安装PHP的mongodb扩展操作命令
2015/07/04 PHP
在Yii2特定页面如何禁用调试工具栏Debug Toolbar详解
2017/08/07 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
php中访问修饰符的知识点总结
2019/01/27 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
Yii框架安装简明教程
2020/05/15 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
利用js实现遮罩以及弹出可移动登录窗口
2013/07/08 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
详解JS模块导入导出
2017/12/20 Javascript
详解vue父子组件关于模态框状态的绑定方案
2019/06/05 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
vue css 引入asstes中的图片无法显示的四种解决方法
2020/03/16 Javascript
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
Python中使用item()方法遍历字典的例子
2014/08/26 Python
python去除所有html标签的方法
2015/05/05 Python
python实现周期方波信号频谱图
2018/07/21 Python
使用Python自动化破解自定义字体混淆信息的方法实例
2019/02/13 Python
Python操作SQLite数据库过程解析
2019/09/02 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
2020/06/02 Python
Python如何读取、写入CSV数据
2020/07/28 Python
Speedo速比涛德国官方网站:世界领先的泳装品牌
2019/08/26 全球购物
易程科技软件测试笔试
2013/03/24 面试题
人事主管岗位职责范本
2013/12/04 职场文书
2014年学习雷锋活动总结
2014/03/01 职场文书
导游词之无锡东林书院
2019/12/11 职场文书