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類的等效函數,則線程終止並且代碼停止運行。 在節點中,沒有要停止的線程。 reqres不會再觸發任何事件,但回調中的代碼可以繼續運行(只要它不會嘗試調用需要打開有效響應的res上的方法)。





express