博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Express代理中间件问题与解决方案
阅读量:6105 次
发布时间:2019-06-21

本文共 1211 字,大约阅读时间需要 4 分钟。

前后端分离应用的架构

在前后端分离架构中,为了避免跨域以及暴露内部服务地址。一般来说,我会在Express这层中加入一个反向代理。

所有向后端服务访问的请求,都通过代理转发到内部的各个服务。

这个反向代理服务器,做起来很简单。用这个模块,几行代码就可以搞定。

// app.jsObject.keys(proxyTable).forEach(function (context) {  app.use(proxyMiddleware(context, proxyTable[context]))})

http-proxy-middleware实际上是对于的更加简便的封装。node-http-proxy是http-proxy-middleware的底层包,如果node-http-proxy有问题,那么这个问题就会影响到http-proxy-middleware这个包。

最近的bug

http-proxy-middleware最近有个问题,请求体在被代理转发前,如果请求体被解析了。那么后端服务将会收不到请求结束的消息,从浏览器的网络面板可以看出,一个请求一直在pending状态。

, 实际上这个问题在node-http-proxy也被提出过,而且处于open状态。

目前这个bug还是处于open状态,但是还是有解决方案的。就是将请求体解析的中间件挂载在代理之后

下面的代码,express.json()会对json格式的请求体进行解析。方案1在代理前就进行body解析,所有格式是json的请求体都会被解析。

但是有些走代理的请求,如果我们并不关心请求体的内容是什么,实际上我们可以不解析那些走代理的请求。所以,可以先挂载代理中间件,然后挂载请求体解析中间件,最后挂载内部的一些接口服务。

// 方案1 badapp.use(express.json())Object.keys(proxyTable).forEach(function (context) {  app.use(proxyMiddleware(context, proxyTable[context]))})app.use('/api', (req, res, next)=> {})// 方案2 goodObject.keys(proxyTable).forEach(function (context) {  app.use(proxyMiddleware(context, proxyTable[context]))})app.use(express.json())app.use('/api', (req, res, next)=> {})

总结

经过这个问题,我对Express中间件的挂载顺序有了更加深刻的认识。

同时,在使用第三方包的过程中,如果该包bug,那么也需要自行找出合适的解决方案。而这个能力,往往就是高手与新手的区别。

转载地址:http://exaza.baihongyu.com/

你可能感兴趣的文章
dblink创建
查看>>
磁盘管理
查看>>
luov之SMTP报错详解
查看>>
软件概要设计做什么,怎么做
查看>>
dwr
查看>>
java的特殊符号
查看>>
word2010中去掉红色波浪线的方法
查看>>
fabric上下文管理器(context mangers)
查看>>
JQuery-EasyUI Datagrid数据行鼠标悬停/离开事件(onMouseOver/onMouseOut)
查看>>
并发和并行的区别
查看>>
阅读笔记《游戏策划教程》
查看>>
团队第二次冲刺第五天
查看>>
npm安装教程
查看>>
Java增强的for循环和普通for循环对比
查看>>
颜色渐变的算法
查看>>
第四次作业
查看>>
getLocation需要在app.json中声明permission字段,解决办法
查看>>
痞子衡嵌入式:第一本Git命令教程(5)- 提交(commit/format-patch/am)
查看>>
P2863 [USACO06JAN]牛的舞会The Cow Prom
查看>>
xtrabackup工具
查看>>