javascript - Nodejs服務(wù)器中 應(yīng)該何時(shí)res.end()呢?
問(wèn)題描述
有這樣的一個(gè)場(chǎng)景 ’/blog’ 路由下要處理用戶(hù)提交的數(shù)據(jù)假設(shè)要把三份數(shù)據(jù)存儲(chǔ)給三個(gè)key 然后代碼寫(xiě)出來(lái)就變成這樣
function handlePostBlog(req, res){ resid_client.set( key1, data1, function(err, response){resid_client.set(key2, data2, function(err,response){ resid_client.set(key3, data3, function(err, response){if(response === ’ok’){ res.writeHead(200, ...) res.end()} })}) })}
不考慮好不好看。。雖然用promise包裝的好看一些 但是在最后一個(gè)回調(diào)中res.end()來(lái)關(guān)閉連接,是不是存在問(wèn)題?這個(gè)請(qǐng)求會(huì)被掛起很長(zhǎng)一段時(shí)間把?一般這種地方應(yīng)該怎么處理?因?yàn)橹恍枰猻et而不需要返回結(jié)果給用戶(hù),所以收到請(qǐng)求之后就直接res.end()來(lái)關(guān)閉連接可以不?
問(wèn)題解答
回答1:這取決于你是否希望這個(gè) HTTP 請(qǐng)求的返回結(jié)果與數(shù)據(jù)庫(kù)操作的結(jié)果有關(guān)聯(lián)性,以及用戶(hù)交互設(shè)計(jì)是否容忍這個(gè)操作所花費(fèi)的時(shí)間。
你在設(shè)計(jì)這個(gè) ’/blog’ 接口時(shí),需要明確指明 HTTP 返回 200 意味著什么。如果你們的業(yè)務(wù)場(chǎng)景只關(guān)心數(shù)據(jù)交付到后端,不關(guān)心后端是否正確存儲(chǔ)到數(shù)據(jù)庫(kù),那肯定可以直接結(jié)束掉 HTTP 請(qǐng)求。如果你們希望終端用戶(hù)得到這個(gè)確切的提交結(jié)果,那需要考慮交互層面了,設(shè)計(jì)良好的交互效果,2-6秒的等待,用戶(hù)體驗(yàn)不會(huì)很差(指AJAX請(qǐng)求場(chǎng)景下,打開(kāi)新頁(yè)面場(chǎng)景下還是慎重)。寫(xiě)三次redis幾乎是不花時(shí)間,比起 HTTP 請(qǐng)求本身的鏈路延遲根本不算什么。
具體業(yè)務(wù)場(chǎng)景還要具體分析。碰到特別耗時(shí)的操作,前端提交操作請(qǐng)求后輪訓(xùn)結(jié)果也不失為一種解決方案。
回答2:看頁(yè)面顯示和數(shù)據(jù)庫(kù)操作結(jié)果有沒(méi)有相關(guān)性。如果有相關(guān)性,可以等待數(shù)據(jù)庫(kù)操作結(jié)束之后返回。也可以做成異步隊(duì)列的方式直接返回,成功后在推送結(jié)果。最終怎么樣,還是看你需求。
相關(guān)文章:
1. bootstrp是col-md-12列的,只有col-md-10有內(nèi)容,可以讓沒(méi)有內(nèi)容的不占據(jù)位置嗎;2. 常量在外面不加引號(hào)會(huì)報(bào)錯(cuò)。3. wordpress里,這樣的目錄列表是屬于小工具還是啥?4. android - Genymotion 微信閃退 not find plugin.location_google.GoogleProxyUI5. python如何設(shè)置一個(gè)隨著系統(tǒng)時(shí)間變化的動(dòng)態(tài)變量?6. 百度地圖 - Android app中準(zhǔn)備接入地圖sdk,百度VS高德哪個(gè)好一點(diǎn)?7. 我的怎么不顯示啊,話(huà)說(shuō)有沒(méi)有QQ群什么的8. mysql federated引擎無(wú)法開(kāi)啟9. MySQL 使用 group by 之后然后 IFNULL(COUNT(*),0) 為什么還是會(huì)獲得 null10. sublime text3安裝package control失敗
