node.js - js教學 - 為什麼我可以在“res.send”之後執行代碼?
node js教學 (2)
我想知道以下代碼的行為背後的機制是什麼:
res.send(200, { data: 'test data' });
console.log('still here...');
我的理解是res.send
不返回函數,但關閉連接/結束請求 。 這可以解釋為什麼我仍然可以在res.send
命令之後執行代碼(我查看了快速源代碼並且它似乎不是異步函數)。
還有什麼東西在玩,我可能會失踪嗎?
https://src-bin.com
Answer #1
編輯:我不再執行下面解釋的操作,因為在不需要時不應返回值。 它使您的代碼可讀性降低,看起來很亂。 相反,我建議將return語句與res.send()
分開。 @slavafomin在評論中對此做了很好的解釋。
一種停止執行函數並同時發送響應的簡單方法就是這樣做
return res.send('500', 'Error message here');
這允許您使用short if
語句來處理錯誤,例如:
if (err) {
return res.send('500', 'Error message here');
}
res.send
函數的確切返回是一個對象 , 在你結束它之後似乎包含連接的整個狀態 (請求,狀態,標題等),但這應該是不重要的,因為你不會做任何事情用它。
Answer #2
肯定會end
HTTP響應,但它不會對您的代碼執行任何特殊操作。
即使您已經結束回复,也可以繼續做其他事情。
然而,你不能做的是用res
做任何有用的事情。 由於響應結束,您無法向其寫入更多數據。
res.send(...);
res.write('more stuff'); // throws an error since res is now closed
此行為與其他傳統框架(PHP,ASP等)不同,後者將響應分配給HTTP請求並在響應結束時終止線程。 如果調用ASP的Response.End
類的等效函數,則線程終止並且代碼停止運行。 在節點中,沒有要停止的線程。 req
和res
不會再觸發任何事件,但回調中的代碼可以繼續運行(只要它不會嘗試調用需要打開有效響應的res
上的方法)。