当前位置: 首页 > 后端技术 > Node.js

Express代理中间件问题及解决方法

时间:2023-04-03 18:57:41 Node.js

前后端分离的应用架构在前后端分离架构中,是为了避免跨域和暴露内部服务地址。通常,我会在Express层添加一个反向代理。所有对后端服务访问的请求都通过代理转发给各种内部服务。这个反向代理服务器做起来非常简单。有了http-proxy-middleware模块,几行代码就可以搞定。//app.jsObject.keys(proxyTable).forEach(function(context){app.use(proxyMiddleware(context,proxyTable[context]))})http-proxy-middleware其实是对node-http-proxy更方便的封装。node-http-proxy是http-proxy-middleware的底层包。如果node-http-proxy有问题,那么这个问题会影响包http-proxy-middleware。最近的bughttp-proxy-middleware最近有个问题,如果requestbody在被代理转发之前就被解析了。那么后端服务就不会收到请求结束的消息了。从浏览器的网络面板可以看到有一个请求一直处于pending状态。Cannotproxyafterparsingbody#299,其实这个问题在node-http-proxy中也有人提出过,并且处于开启状态。POST失败/挂起重新流式传输的示例也不起作用#1279这个错误仍然存??在,但仍有解决方案。就是在代理后面挂载解析请求体的中间件。在下面的代码中,express.json()会解析json格式的请求体。方案一在代理之前进行body解析,所有json格式的请求体都会被解析。但是对于一些代理请求,如果我们不关心请求体的内容是什么,我们其实不需要去解析那些代理请求。所以可以先挂载代理中间件,再挂载请求体解析中间件,最后挂载一些内部接口服务。//方案一badapp.use(express.json())Object.keys(proxyTable).forEach(function(context){app.use(proxyMiddleware(context,proxyTable[context]))})app.use('/api',(req,res,next)=>{})//方案2goodObject.keys(proxyTable).forEach(function(context){app.use(proxyMiddleware(context,proxyTable[context]))})app.use(express.json())app.use('/api',(req,res,next)=>{})小结经过这道题,我对Express中间件的挂载顺序有了更深的理解。同时,在使用第三方包的过程中,如果包有bug,你也需要自己寻找合适的解决方案。而这种能力,往往就是高手和新手的区别。