BUG排查 - koa2 中 koa-body 和 koa-bodyparser 共用時 POST 會出現超時

週日有個小夥加我,幫他排查了一下問題。正好記錄一下。前端

前端是:axios
後臺是:koa2
問題:axiospost 請求不攜帶參數請求正常,攜帶參數就無響應。ios

由於我也不知道小夥那些說的是真的,那些是假的,那咱們就一點一點排查,我大體定位問題爲如下幾個方向。json

  1. 參數攜帶不正確,axios 發過去的數據是錯的,好比說被 {id: 1} 卻發送的 [object Object]
  2. 參數攜帶不正確,好比說後臺只接收 appliction/jsonapplication/x-www-form-urlencodedmultipart/form-data 其中一種

這流程沒毛病吧,先找前端自身問題,沒問題就出去懟人axios

排查問題

前端請求數據排查

由於不知道小夥水平,就沒看 network。我讓他直接請求個人接口 https://www.lilnong.top/cors/koa-sf,而後讓他截圖。
發現數據被收到了,證實前端確定是沒問題的
image.png微信

服務端排查

路由排查

開始我懷疑他路由配置有問題。看上去這個路由也沒問題。有請求就應該能收到。
image.pngapp

content-type 限制排查

原生的話,就是監聽流,而後拼接。cors

new Promise(function(resolve){
    let str = ''
    ctx.req.on('data', (data) => {
        str += data
    })
    ctx.req.addListener('end', () => {
        resolve(str)
    })
})

中間件的話,就是 koa-bodykoa-bodyparser 之類的,經過小夥的截圖看到以下畫面。支持多種類型,起來也沒問題。
image.pngkoa

其餘中間件排查

由於小夥是新手嘛,總有可能用一些奇奇怪怪的中間件,看看是否是有什麼檢查阻塞了請求post

image.png

這張圖片上就有疑點了,使用了兩個中間件都是處理 body 的。測試

app.use(bodyParser())
app.user(KoaBody())

用關鍵詞一搜索,妥妥的BUG呀。那咱們把app.use(bodyParser()) 一刪就 OK 了。

image.png

起服務,刷頁面,測試,OK。

爲何 koa-bodyparserkoa-body 一塊兒使用會有問題

感興趣的小夥伴能夠去看看源碼。

這兩個庫都依賴 co-body 這個庫,這個庫裏面依賴raw-body。而後下圖能夠看到,使用的仍是流。

image.png

微信公衆號:前端linong

clipboard.png

總結

  1. 不要同時使用 koa-bodyparserkoa-body
  2. 串行讀取兩次流的數據會怎麼樣呢?留個課後做業吧。
相關文章
相關標籤/搜索