node req.pipe 502

心血来潮,在旧项目的node中加入了node接口,发现在 app.post() 中接收不到页面传递的body 参数。
发现是新版的 express 需要引入 body-parser 模块才能正常接收参数。

  const bodyParser = require('body-parser');
  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));

这样是确实可以自己愉快的写接口,感觉自己棒棒哒!
但是项目上线之后,发现以前的页面写的ajax 请求全部报 502 。作为一名前端,我的第一感觉就是后端同事的服务器挂了········
此刻后端同事失联,只能自己找问题。
于是马上回滚线上代码,结果以前的页面可以用了。 “啪啪啪啪···,脸好痛”!
那么问题在哪儿呢?

其实node 部分的代码逻辑没有问题,问题在于,以前的API接口,都写了一个代理转发

router.post('/api/*', function (req, res) {
  var url = 'http://xxx.xxx.com' + req.url;
  req.pipe(request(url)).pipe(res);
})

看出来问题了吗?
没有!是的,我第2次都没看出有问题。问题在于 request()

从后端调试发现node转发post过来的body体为空。说明应该是有动作已经读取了请求的输入流,因为请求的输入流只能读取一次。
body-parser用于body体的解析,因此其自动读取了请求输入流导致浏览器请求被pipe到后端后,后端读取的body体为空。

所以解决办法就是将一下代码放在 req.pipe之后,问题解决。

  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));

你可能感兴趣的:(node req.pipe 502)