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。

在该库的实现过程中越发觉得理论知识的重要性,所谓理论是行动的先导,之前都是使用第三方库,也没去关心一些底层的细节处理。

后面有空一定要多看看底层的实现,否则遇到难搞问题就卡住了。

时间: 2024-10-20 08:55:07

node-http-proxy修改响应结果的相关文章

spring拦截器中修改响应消息头

问题描述 前后端分离的项目,前端使用Vue,后端使用Spring MVC. 显然,需要解决浏览器跨域访问数据限制的问题,在此使用CROS协议解决. 由于该项目我在中期加入的,主要负责集成shiro框架到项目中作为权限管理组件,之前别的同事已经写好了部分接口,我负责写一部分新的接口. 之前同事解决跨域问题使用Spring提供的@CrossOrigin注解: @RequestMapping(value = "/list.do", method = RequestMethod.GET) @R

node js moment 修改时间格式 日期格式与int格式互相转化

node js moment 修改时间格式 日期格式与int格式互相转化 nvm use 8.3 > moment = require('moment') > days = '2019-07-01' '2019-07-01' > moment().subtract(days, 'days').unix() 1563356732 > let time = moment.valueOf(1563356732) 原文地址:https://www.cnblogs.com/wangjiale

nginx代理 修改响应内容

最近接手一个问题 在每次出现404的情况时:需要在响应的内容中,添加 request_uri  remote_ip  等一些内容. 开始的时候 发现一个模块  --with-http_sub_module 可以对响应内容进行一个替换修改 但是这个模块需要从新对nginx进行编译,在编译的时候添加模块 --prefix=/usr/local/nginx --with-http_sub_module 然后就可以在nginx.conf中使用了 sub_filter  thisisatestipaddr

Node.js完整的响应html页面(包括css,js文件)

主要思想就是任何一个静态文件也应该做响应,一个获取静态文件都应当请求来处理,这是主要思想. 同时要注意两点.第一,对于不同的文件类型,比如html,css,js,请求头里面的文件类型需要根据不同的文件类型注明, 第二,文件的路径需要表达准确,fs.readFile方法的第一个参数path是已起服务的文件为根目录,这里就是以server.js文件的所在目录为根目录 文件目录 文件夹public Index.html Css文件夹 Reset.css Index.css Js文件夹 vue.min.

jmeter修改响应结果编码

1.添加一个BeanShell PostProcessor 2.设置脚本:prev.setDataEncoding("UTF-8");

回到javaweb的第二天(Servlet jsp相关)(需要继续看mvc的深挖,看filter修改请求,修改响应的目的是什么。)

这里说的是机制,什么机制: session和cookie的机制. session目的:唯一识别用户.  cookie的话,是服务器分配给浏览器的标识. 即:      cookie是一个码  而session是识别用户的方法. 这里讲到的是: 除了cookie之外,还可以用别的机制来实现session. 即 学会了如何去使用jsp里面内嵌代码,如何去jsp里面引入另外一个jsp 由于jsp一定是放在指定目录下面的,所以说引用另外一个jsp的时候直接用就行了. 如何通过import去引用简单的类名

打通前后端全栈开发node+vue进阶【课程学习系统项目实战详细讲解】(3):用户添加/修改/删除 vue表格组件 vue分页组件

第三章 建议学习时间8小时      总项目预计10章 学习方式:详细阅读,并手动实现相关代码(如果没有node和vue基础,请学习前面的vue和node基础博客[共10章] 演示地址:后台:demoback.lalalaweb.com  前台:demo.lalalaweb.com 演示过程中可能会发现bug,希望即时留言反馈,谢谢 源码下载:https://github.com/sutianbinde/classweb               //不是全部的代码,每次更新博客才更新代码 学

c# winform TreeView NODE(节点) 重命名或获取节点修改后的值

在程序开发过程中我们经常用到treeview,还经常要修改节点的名字.节点名字修改后还想及时更新数据库.这时问题就来了,怎样获取NODE(节点)更新后的值呢?本人试了很多方法最终分析出treeview节点名字修改的AfterLabelEdit事件.事件内有两个参数如下代码 sender 和 e. private void treeView2_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) { } 代码内的e 有两个值,e.Lable

关于使用chrome插件修改所有的网站的响应responseHeaders头的注意

1 目前我掌握的调试技巧很不方便,现在使用的是浏览器动作,每次都需要点击那个popup页面弹出,然后右键->查看元素,才能显示它的调试面板.一点击某些位置它又没有了; 2 修改响应报头的值时,竟然在网页的调试工具的network面板上是不会变化的,也就是说,不能反馈出来,但是发现在实际的使用中,已经发生了改变,在popup插件的调试面板中输出的值也可以看到是改变的,这就很郁闷了; 3 比如onHeadersReceived事件,它默认details参数是不包含responseHeaders属性的