node req.pipe 502

心血來潮,在舊項(xiàng)目的node中加入了node接口,發(fā)現(xiàn)在 app.post() 中接收不到頁面?zhèn)鬟f的body 參數(shù)。
發(fā)現(xiàn)是新版的 express 需要引入 body-parser 模塊才能正常接收參數(shù)。

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

這樣是確實(shí)可以自己愉快的寫接口,感覺自己棒棒噠!
但是項(xiàng)目上線之后,發(fā)現(xiàn)以前的頁面寫的ajax 請求全部報(bào) 502 。作為一名前端,我的第一感覺就是后端同事的服務(wù)器掛了········
此刻后端同事失聯(lián),只能自己找問題。
于是馬上回滾線上代碼,結(jié)果以前的頁面可以用了。 “啪啪啪啪···,臉好痛”!
那么問題在哪兒呢?

其實(shí)node 部分的代碼邏輯沒有問題,問題在于,以前的API接口,都寫了一個代理轉(zhuǎn)發(fā)

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

看出來問題了嗎?
沒有!是的,我第2次都沒看出有問題。問題在于 request() 。

從后端調(diào)試發(fā)現(xiàn)node轉(zhuǎn)發(fā)post過來的body體為空。說明應(yīng)該是有動作已經(jīng)讀取了請求的輸入流,因?yàn)檎埱蟮妮斎肓髦荒茏x取一次。
body-parser用于body體的解析,因此其自動讀取了請求輸入流導(dǎo)致瀏覽器請求被pipe到后端后,后端讀取的body體為空。

所以解決辦法就是將一下代碼放在 req.pipe之后,問題解決。

  app.use(bodyParser.json());
  app.use(bodyParser.urlencoded({ extended: false }));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容