最近在项目中使用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修改响应结果实例代码,希望对大家有所帮助!
node,http,proxy
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。