最近作管理後臺的重構或者說重作. 至於爲何要重構.
隨意的解釋:前端
客觀的解釋:node
再多一點解釋:react
額外說兩句, 這裏的express + ejs的項目屬於前端項目, 後臺有不少nodejs編寫的形式微服務的服務.jquery
由於是後臺管理項目, 美觀要求並非那麼高. 個人規劃是.express
基於koa的node中間層編程
前端項目
使用 create-react-app + react-app-rewired + ant + mobx 構建項目,
ant design已經基本夠用, 實際上mobx均可以不用.api
這裏就有兩個項目項目了, 一個ui項目, 一箇中間層api項目.服務器
開發模式下, ui項目是經過dev-server啓動的, 會經過代理轉發請求到中間層api項目, 中間層api項目再轉發到實際的服務. 這一切看起來都很美好, 也沒毛病.session
我隨手拈來, 配置好, 開始請求. 就淚奔了. 請求死活過不去.app
express下面有很好用的http-proxy-middleware, 可是koa並無, koa官方推薦的是koa-proxies 和koa-better-http-proxy, 本身搜索發現 koa-proxy下載量和star都還要高一些, 因而本身就開始挨個試試, 均失敗.
開始懷疑是版本問題, 查看均是支持的, 並且debug確實執行了請求發送, debug進入源碼發現 Socket hang up.
後來檢查源碼, 其實都是基於http-proxy進行的封裝, 因而參考別人的代碼, 本身簡單的封裝了一個版本, 進行debug, 結果依舊,
後來搜索發現, koa下能使用express的中間件, 須要經過轉換, 這個中間件就是koa-connect, 因而進行切換, 結果仍是失敗, 心疼
接着嘗試, 在http-proxy的各個生命週期進行攔截, 成效也不大, 卻是瞭解了一下http-proxy
咱們的接口所有都是post調用的,並且接受的數據格式都是x-www-form-urlencoded, 偶爾一次發現, 使用get竟然轉發到了服務器, 只是提示不容許get調用, 其實說明已經能聯通, 可是post倒是過不去. 那就說明問題極可能處在數據傳遞的格式.
發現了這篇文章,
http-proxy-middleware nodejs post請求超時問題 x-www-form-urlencoded
我把代碼提早了, 結果然的是ok了, 個人眼淚啊.
可是, 不能這樣啊, 個人auth攔截確定會先於proxy, auth以前確定還有bodyParser, session等中間件, 大哥這可不行啊.
繼續搜索 edit-post-parameters-prior-to-forwarding-to-a-proxy-target-and-sending-response
onProxyReq(proxyReq, req, res) { if ( req.method == "POST" && req.body ) { // Add req.body logic here if needed.... // .... // Remove body-parser body object from the request if ( req.body ) delete req.body; // Make any needed POST parameter changes let body = new Object(); body.filename = 'reports/statistics/summary_2016.pdf'; body.routeid = 's003b012d002'; body.authid = 'bac02c1d-258a-4177-9da6-862580154960'; // URI encode JSON object body = Object.keys( body ).map(function( key ) { return encodeURIComponent( key ) + '=' + encodeURIComponent( body[ key ]) }).join('&'); // Update header proxyReq.setHeader( 'content-type', 'application/x-www-form-urlencoded' ); proxyReq.setHeader( 'content-length', body.length ); // Write out body changes to the proxyReq stream proxyReq.write( body ); proxyReq.end(); } }
看到重寫了content-type和content-length, 我就笑了. 仍是本身太天真, 沒理解好這個onProxyReq方法, 因而我也這麼重寫, 再提早其餘中間件, 就沒有問題了.
我真的就能苦笑了, 還好解決了問題. 關於http-proxy打算有時間深刻看一看, 值得擁有.