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 相关文章推荐
用javascript实现分割提取页面所需内容
May 09 Javascript
不要小看注释掉的JS 引起的安全问题
Dec 27 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
Nov 19 Javascript
javascript获取隐藏dom的宽高 具体实现
Jul 14 Javascript
php和js对数据库图片进行等比缩放示例
Apr 28 Javascript
JavaScript获取页面中表单(form)数量的方法
Apr 03 Javascript
jquery实现的3D旋转木马特效代码分享
Aug 25 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
Vue项目中如何引入icon图标
Mar 28 Javascript
electron + vue项目实现打印小票功能及实现代码
Nov 25 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
ES6 Promise对象的应用实例分析
Jun 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本地服务器分享
2013/02/19 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
php实现xml转换数组的方法示例
2017/02/03 PHP
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
多次注册事件会导致一个事件被触发多次的解决方法
2013/08/12 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
讲解vue-router之命名路由和命名视图
2018/05/28 Javascript
jQuery层叠选择器用法实例分析
2019/06/28 jQuery
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[03:24]2014DOTA2国际邀请赛 神秘商店生意火爆
2014/07/18 DOTA
[06:11]2014DOTA2国际邀请赛 专访团结一心的VG战队
2014/07/21 DOTA
Python中无限元素列表的实现方法
2014/08/18 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
python制作图片缩略图
2019/04/30 Python
python+logging+yaml实现日志分割
2019/07/22 Python
python3 mmh3安装及使用方法
2019/10/09 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
美体小铺法国官方网站:The Body Shop法国
2020/06/04 全球购物
车辆维修工自我评价怎么写
2013/09/20 职场文书
大学毕业的自我鉴定
2013/10/08 职场文书
倡议书格式
2014/08/30 职场文书
驻村工作简报
2015/07/20 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
2021/03/31 Servers
golang中字符串MD5生成方式总结
2021/07/04 Golang
PHP获取学生成绩的方法
2021/11/17 PHP