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 相关文章推荐
执行iframe中的javascript方法
Oct 07 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
Mar 04 Javascript
JScript中的条件注释详解
Apr 24 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
Jan 08 Javascript
js获取html的span标签的值方法(超简单)
Jul 26 Javascript
javascript的几种写法总结
Sep 30 Javascript
AngularJS表单基本操作
Jan 09 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
小程序实现五星点评效果
Nov 03 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
Jul 06 Javascript
详解vue 2.6 中 slot 的新用法
Jul 09 Javascript
Vue 3.0 前瞻Vue Function API新特性体验
Aug 12 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下通过IP获取地理位置的代码(小偷程序)
2011/06/09 PHP
php生成图形验证码几种方法小结
2013/08/15 PHP
Laravel使用PHPQRCODE实现生成带有LOGO的二维码图片功能示例
2017/07/07 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
设置下载不需要倒计时cookie(倒计时代码)
2008/11/19 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
javascript时区函数介绍
2012/09/14 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
jQuery中slice()方法用法实例
2015/01/07 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
详解JavaScript的变量和数据类型
2015/11/27 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
js获取Get值的方法
2016/09/29 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
mui框架 页面无法滚动的解决方法(推荐)
2018/01/25 Javascript
完美解决iview 的select下拉框选项错位的问题
2018/03/02 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
vue最简单的前后端交互示例详解
2018/10/11 Javascript
泛谈JS逻辑判断选择器 || &&
2019/05/24 Javascript
小程序实现短信登录倒计时
2019/07/12 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
JS document对象简单用法完整示例
2020/01/14 Javascript
Vue路由守卫及页面登录权限控制的设置方法(两种)
2020/03/31 Javascript
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
python使用xlsxwriter实现有向无环图到Excel的转换
2018/12/12 Python
python 通过可变参数计算n个数的乘积方法
2019/06/13 Python
Python实现EXCEL表格的排序功能示例
2019/06/25 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
python xlsxwriter模块的使用
2020/12/24 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
节能标语大全
2014/06/21 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书