更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent.com/developer
作者:谢易成
导语
最近有个需求,需要对业务管理后台的操作记录进行上报。一般这种上报需求都是又后台同学来做比较合适的。但是因为后台人力的原因。这个工作落到了我这个小前端的头上。这里记录下做这个需求踩的一些坑。
一、实现反向代理
做为一个前端工程师,写代理脚本第一选择肯定是node。不过在此之前,要把请求代理到机器A上面的node服务上面。这里使用了tnginx。在nginx.config文件里面添加以下配置并重启。把cgi域名下的请求,代理到机器上面的8000端口node 服务。
然后使用node的http-proxy模块,起一个代理server,就像这样。
var httpProxy = require('http-proxy');
var http = require('http')
http.createServer(function(req, res) { proxy.web(req, res, { target: http://10.213.167.135}); }).listen(8000);
本机使用fiddler 代理cgi域名到测试机器A的ip,刷新一下,成功访问到cgi内容。(ps: 注意idc机器是没有dns解析服务的,这里需要在 /etc/hosts文件上面添加相关域名的ip地址)
二、获取请求的相关数据
成功实现请求代理是一个好的开始。现在,需要开始搞点事情了。首先,我们需要获取请求的参数,这些参数可能是在url里面,也可能是在POST实体里面。url里面的参数很容易拿到,只需要读取req对象的url就能获取。POST实体里面的数据获取比较麻烦,因为POST请求的种类比较多,手动解析比较麻烦。这里使用了formidable模块来解析。然后把解析完成的结果挂载在req对象上面,方便后面获取。
function getBody(request){
var formidable = require('formidable');
var form = new formidable.IncomingForm(),fields = {}; //..巴拉巴拉,解析出参数,挂载在request对象上面 }
除了请求的参数,我们还需要获取cgi回包的数据,这样才能判断这个请求是不是有效的。获取回包数据,可以在res对象上面监听data事件,拼接回包数据。类似这样封装一个方法:
比较坑一点的是,回包可能会被gzip压缩,这样我们上面代码得到的会是乱码。因此处理回包的时候,要判断回包的content-encoding是不是gzip,如果是gzip的话,需要使用node的zlib模块进行解压。
三、进行数据上报
获取了请求的参数和回包内容,我们就可以进行数据上报了,上报的时机应该是在代理请求回包之后。http-proxy模块提供了proxyRes事件给我们监听,我们可以在这个事件的回调函数里面,获取回包的内容,并调用上报方法,使用node的request模块进行数据上报。类似这样:
四、划分路由模块
系统的cgi可能不只是一个命令,可能不只是一种回包格式。所以我们需要添加一个路由模块,把不同请求,映射到对应的处理器上面。可以比较简单的根据正则匹配url,返回不同的模块字符串,然后在代理请求回包后,根据模块字符串require这些模块去处理对应的请求。类似这样:
附:系统设计流程图
五、小结
有了node之后,前端有了更大的舞台,可以帮助解决一些后台的工作。这次的需求只是一个小小的应该例子,后续我们还可以在这个proxy server的基础上,添加白名单做权限限制,限制某些rtx用户只能操作固定的cgi。
领取专属 10元无门槛券
私享最新 技术干货