wang1dot0 / personal-note

记录工作中遇到的个人觉得比较有意思的小问题
https://github.com/wang1dot0/personal-note
0 stars 0 forks source link

[Express] http-proxy-middleware‘s POST method and bodyparser/express.json cannot coexist #1

Open wang1dot0 opened 5 years ago

wang1dot0 commented 5 years ago

在项目中常用的express框架,肯定对http-proxy-middleware和bodyparser这两个中间件不陌生,前者是做代理转发,后者是处理请求体常用中间件,目前在新版本的express中内置了express.json方法,是基于bodyparser的。 在两者结合起来用的时候,我发现会报错!!!!!莫名其妙的错误,服务器504。

  1. 起初以为是接口格式支持问题,但是后端表示根本没有连接日志。
  2. 然后我就用最传统的控制变量法,把bodyparser中间件去掉,神奇地发现一切正常了。。那可不行呀,我需要在proxy中加密处理req.body的,不能这么规避。但是定位了问题,说明bodyparser这个中间件有问题!!!!!但是这么好用的中间件不应该有这么明显的问题吧?
  3. 带着这个疑问,我去查阅google,发现是http-proxy-middleware和bodyparser的问题。最初看到的建议是把bodyparser放在proxy后面。这么干是不报错了,但是proxy中的req.body也取不到了啊。这个解决方法也不行。
  4. 后来在一个issue下面惊奇地发现了一个解决问题,抱着试一试的态度,居然可以用。
    // restream parsed body before proxying
    proxy.on('proxyReq', function(proxyReq, req, res, options) {
    if (req.body) {
        let bodyData = JSON.stringify(req.body);
        // incase if content-type is application/x-www-form-urlencoded -> we need to change to application/json
        proxyReq.setHeader('Content-Type','application/json');
        proxyReq.setHeader('Content-Length', Buffer.byteLength(bodyData));
        // stream the content
        proxyReq.write(bodyData);
    }
    }

相关链接:

  1. https://github.com/chimurai/http-proxy-middleware/issues/202#issuecomment-330405028
  2. https://github.com/chimurai/http-proxy-middleware/issues/40#issuecomment-163398924
  3. https://stackoverflow.com/questions/25207333/socket-hang-up-error-with-nodejs/25651651#25651651