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 相关文章推荐
jQuery Validation实例代码 让验证变得如此容易
Oct 18 Javascript
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
jquery miniui 教程 表格控件 合并单元格应用
Nov 25 Javascript
JavaScript splice()方法详解
Sep 22 Javascript
JS+CSS简单树形菜单实现方法
Sep 12 Javascript
request请求获取参数的实现方法(post和get两种方式)
Sep 27 Javascript
vuejs事件中心管理组件间的通信详解
Aug 09 Javascript
js动态引入的四种方法
May 05 Javascript
使用Vuex解决Vue中的身份验证问题
Sep 28 Javascript
基于JavaScript实现十五拼图代码实例
Apr 26 Javascript
小程序实现列表展开收起效果
Jul 29 Javascript
前端监听websocket消息并实时弹出(实例代码)
Nov 27 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+mysql分页代码详解
2008/03/27 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PHP实现微信退款功能
2018/10/02 PHP
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
window.parent与window.openner区别介绍
2012/04/12 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
浅析JavaScript动画
2015/06/10 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
2015/09/12 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
浅析JS动态创建元素【两种方法】
2016/04/20 Javascript
jQuery基于xml格式数据实现模糊查询及分页功能的方法
2016/12/25 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
生产制造追溯系统之在线打印功能
2019/06/03 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
python中sleep函数用法实例分析
2015/04/29 Python
Python存取XML的常见方法实例分析
2017/03/21 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
python实现自主查询实时天气
2018/06/22 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Win8下python3.5.1安装教程
2020/07/29 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
设置python3为默认python的方法
2018/10/31 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
tensorflow 实现从checkpoint中获取graph信息
2020/02/10 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
火山动力Java笔试题
2014/06/26 面试题
高中毕业的自我鉴定
2013/12/09 职场文书
心得体会范文
2014/01/04 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
go语言求任意类型切片的长度操作
2021/04/26 Golang