node-http-proxy修改响应结果实例代码

 更新时间:2016年06月06日 09:24:20   作者:阿郎博客  
这篇文章主要介绍了node-http-proxy修改响应结果的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

最近在项目中使用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修改响应结果实例代码,希望对大家有所帮助!

相关文章

  • 浏览器解析js生成的html出现样式问题的解决方法

    浏览器解析js生成的html出现样式问题的解决方法

    接触css, javascript有三年多了,今天遇到的问题最令我不可思议,很容易给人一种错觉,那就是js拼成的html结构肯定有问题
    2012-04-04
  • JavaScript 异常处理 详解

    JavaScript 异常处理 详解

    这篇文章主要介绍了JavaScript 异常处理 详解,需要的朋友可以参考下
    2015-02-02
  • 常用的js验证和数据处理总结

    常用的js验证和数据处理总结

    遇到需要对数据及表单验证的,我相信大家都像我一样,喜欢在网上找相关的方法,因为自己写的话,是比较耗时的。今天就给大家分享一下,自己在工作中总结的一些常用的js。
    2016-08-08
  • 详解原生js实现offset方法

    详解原生js实现offset方法

    本篇文章主要介绍了原生js实现offset方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • js点击页面其它地方将某个显示的DIV隐藏

    js点击页面其它地方将某个显示的DIV隐藏

    今天一朋友问我 点击一按钮弹出一个DIV,然后要求点击页面其它地方隐藏这个DIV
    2012-07-07
  • ES6中promise详解及用法实例

    ES6中promise详解及用法实例

    Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大,下面这篇文章主要给大家介绍了关于ES6中promise详解及用法的相关资料,需要的朋友可以参考下
    2022-11-11
  • js实现表格字段排序

    js实现表格字段排序

    本篇文章只要是对js表格字段排序的实例代码进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • 基于JavaScript实现在新的tab页打开url

    基于JavaScript实现在新的tab页打开url

    这篇文章主要介绍了基于JavaScript实现在新的tab页打开url 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • JavaScript模块管理的简单实现方式详解

    JavaScript模块管理的简单实现方式详解

    这篇文章主要介绍了JavaScript模块管理的简单实现方式,它方便组织你的代码,提高项目的可维护性。一个项目的可维护性高不高,也体现一个程序员的水平,在如今越来越复杂的前端项目,这一点尤为重要。,需要的朋友可以参考下
    2019-06-06
  • 全面解析Bootstrap排版使用方法(标题)

    全面解析Bootstrap排版使用方法(标题)

    这篇文章全面解析了Bootstrap排版使用方法,本文重点介绍Bootstrap标题排版,感兴趣的小伙伴们可以参考一下
    2015-11-11

最新评论