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修改响应结果实例代码,希望对大家有所帮助!

(0)

相关推荐

  • node.js中的http.response.writeHead方法使用说明

    方法说明: 向请求的客户端发送响应头. 该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头. 语法: 复制代码 代码如下: response.writeHead(statusCode, [reasonPhrase], [headers]) 接收参数: statusCode              HTTP状态码,如200(请求成功),404(未找到)等. reasonPhrase headers                   类似关联数组的对象,表示响应头的每个属性

  • WinHTTP Web Proxy Auto-Discovery Service 服务处于停止状态

    但是有一天早上来发现全部电脑都无法上网.PING ISA都不通.重新启动后正常.我检查系统日志里面有3条关于WEB代理的日志: 1.The WinHTTP Web Proxy Auto-Discovery Service has been idle for 15 minutes, it will be shut down. 2.The WinHTTP Web Proxy Auto-Discovery Service suspended operation. 3.WinHTTP Web Proxy

  • node.js中的http.response.write方法使用说明

    方法说明: 向请求的客户端发送响应内容. 在 response.end() 之前,response.write() 可以被执行多次. 语法: 复制代码 代码如下: response.write(chunk, [encoding]) 参数: chunk                      是一个buffer 或 字符串,表示发送的内容 encoding                如果chunk是字符串,就需要指定encoding来说明它的编码方式,默认utf-8 例子: 复制代码 代码如

  • Win2003 WinHTTP Web Proxy Auto-Discovery Service 导致的服务器重启

    解决办法: 禁用服务 Win2003 WinHTTP Web Proxy Auto-Discovery Service. 双击右下角的时间,在"Internet时间"选项卡中将"自动与 Internet 时间服务器同步"选项去掉.

  • 在VPS上用3Proxy架设http代理和socks代理(Ubuntu环境)

    3Proxy是俄罗斯人开发的(怎么又是俄罗斯人,前面nginx),主页在www.3proxy.ru. 3Proxy支持windows和linux等各种平台.windows下直接下载安装即可,Linux下面需要自己编译. 虽然是编译安装,但是也是毫不费力. 下载.编译.安装: wget http://www.3proxy.ru/current/3proxy-0.7-devel.tgz tar zxf 3proxy-0.7-devel.tgz cd 3proxy-0.7 make –f Makefi

  • node.js中的http.response.end方法使用说明

    方法说明: 结束响应,告诉客户端所有消息已经发送.当所有要返回的内容发送完毕时,该函数必须被调用一次. 如何不调用该函数,客户端将永远处于等待状态. 语法: 复制代码 代码如下: response.end([data], [encoding]) 接收参数: data                           end()执行完毕后要输出的字符,如果指定了 data 的值,那就意味着在执行完 response.end() 之后,会接着执行一条 response.write(data , e

  • GO语言实现的http抓包分析工具pproxy介绍

    引言 web 开发和 API 开发中难免要详细分析 http 请求和响应信息.web 开发的话,浏览器提供了便利的工具,比如 chrome 和 IE 都带了 develop tool,而 firefox 更是有十分强大的 firebug,可以让 http 请求的所有秘密一览无遗.目前是 app 大流行的时代,想要观察 app 中得 http 请求的秘密,浏览器的工具和插件都无能为力,有不少本地化的软件可以很好的解决这个问题,Windows 平台下有大名鼎鼎的 Fiddler 和 HttpWatc

  • node.js中的http.request方法使用说明

    方法说明: 函数的功能室作为客户端向HTTP服务器发起请求. 语法: 复制代码 代码如下: http.get(options, callback) 由于该方法属于http模块,使用前需要引入http模块(var http= require("http") ) 接收参数: option   数组对象,包含以下参数: host:                  表示请求网站的域名或IP地址(请求的地址). 默认为'localhost'. hostname:        服务器名称,主机

  • node.js中的http.response.setHeader方法使用说明

    方法说明: 设置头文件信息. 如果将要发送的信息已包含头文件,执行该方法后头文件的值将被改写. 如果一个头文件需要传递多个值,可以使用数组. 语法: 复制代码 代码如下: response.setHeader(name, value) 接收参数: name          响应头的类型,注意这个名字是不区分大小写. value           响应头的值 例子: 复制代码 代码如下: response.setHeader("Content-Type", "text/ht

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

    最近在项目中使用node-http-proxy遇到需要修改代理服务器响应结果需求,该库已提供修改响应格式为html的方案:Harmon,而项目中返回格式统一为json,使用它感觉太笨重了,所以自己写了个可解析和修改json格式的库, 期间也遇到了之前未关注的问题:http传输编码.node流的相关处理.下面是实现代码: var zlib = require('zlib'); var concatStream = require('concat-stream'); /** * Modify the

  • Angularjs修改密码的实例代码

    修改密码逻辑思维 首先要输入旧的密码,判断旧的密码是否正确(后台判断) 其次输入新的密码,判断新密码格式(可增加) 最后判断新密码和确认密码输入是否一致 html部分 <form class="form-horizontal" role="form"> <div class="form-group"> <label class="col-sm-2 control-label"><i c

  • Java Socket编程服务器响应客户端实例代码

    通过输入流来读取客户端信息,相应的时候通过输出流来实现. 服务端类的代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; impo

  • vue滚动固定顶部及修改样式的实例代码

    滚动固定位置有多种方法 1 css3  粘性定位 position:sticky: top:20px: 2直接position:fixed:给顶部盒子设置一个margin-top刚好是需要固定的盒子的高度 3事件监听更改style中的position属性 ** 修改样式 滚动监听事件中使用this.$refs.xxx.style.color='xxxx' 这种方式会报错 Uncaught TypeError: Cannot read property 'style' of undefined 所

  • python按键按住不放持续响应的实例代码

    在学习飞机大战(我也不知道为什么都拿这个练手),飞机左右控制都是按键按一次移动一次,不能按住一个键后持续移动,离开后停止移动. 为了解决这个,查看了参考手册,说让用pygame.key.set_repeat() 方法,奈何我刚开始学也看不太明白,只能看懂一些.并且看别人的代码也比较费劲,毕竟不是自己的逻辑,得看一会儿,最后还是自己想了一个办法,用flag标签: 大体思路是这样的,比如向左持续移动,先在hero定一个属性标签设置布尔值为False,然后定义移动方法,在为真时,移动:再然后定义键盘的

  • JavaScript修改注册表实例代码

    注册表有关安全设置项的说明: 注册表路径: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 1.         Zones 项包含表示为计算机定义的每个安全区域的项.默认情况下,定义以下 5个区域(编号从 0  到 4): 值                   设置 ------------------------------ 0                 我的电脑

  • vue+node 实现视频在线播放的实例代码

    1.node服务端 数据流传输,可在线缓存 //获取参数 var params=urldeal.parse(req.url,true).query const ROOT_PATH = process.cwd();//必须使用绝对路径,使用相对路径会直接下载文件 let path =ROOT_PATH+params.url; let stat = fs.statSync(path); //获取文件信息 let fileSize = stat.size; let range = req.header

  • Go递归修改文件名的实例代码

    在生活中我们往往有这样的需求,就是从网上找的文件资源经常包含了一些无用信息,而且在它的子目录下也同样存在,如果我们手动一个个的修改的话会特别麻烦,也特别耗时,我们可以考虑把这件事交给计算机来做. 如下图,我的桌面有一个名为dir[我爱你]的目录,而且这个目录下的子目录和文件都包含[我爱你],这个[我爱你]对于我们来说是完全无用的,我们可以用Go的文件操作库来递归对文件进行重命名,把不需要的名字替换为空 示例代码: package main import ( "bufio" "

  • Laravel 修改验证异常的响应格式实例代码详解

    Laravel 默认验证不通过后响应格式如下,有时此格式并不满足自己要求,需要修改格式. // status 422 { "message":"The given data was invalid.", "errors":{ "url":[ "url 无效的格式" ] } } 当 Request 验证失败时会抛出 ValidationException异常,最终交由全局异常Handler类处理.Handle

  • PHP对XML内容进行修改和删除实例代码

    本文主要介绍的是PHP对XML内容进行修改和删除的方法,下面话不多说,我们来看实例 原理图如下 示例代码 example.xml <?xml version="1.0" encoding="utf-8"?> <root> <book id="1"> <title>title1</title> </book> <book id="2"> <

随机推荐