2011-08-31 140 views

回答

4

與大多數網絡腳本語言不同,在Node中,來自不同客戶端的許多HTTP請求可以同時處於「活動」狀態。你怎麼知道你在迴應哪個客戶?

因此,儘管您認爲在任何給定時間只有1個請求和響應,但實際上對所有當前客戶端都有打開的請求。

+1

你說的是正確的,但你實際上可以使用節點域來實現他所要求的。請參閱下面的帖子。 – CBP

+0

我想這個答案只是重申了這個問題。有選項。域和連續本地存儲。公平地說,我不確定這些選項在發佈時是否可用。 – tybro0103

2

由於異步事件循環,理論上可以使請求和響應varibale全局可用......但是,只要從當前上下文返回(即使調用其他異步事件),下一個事件在該隊列將被執行。

現在想起另一個HTTP客戶端連接在此期間。它會再次改變全局變量,你會失去舊的。所以最後,你的方法漏了。

只有一個線程執行你自己的代碼,一切都顯然是線程安全的。但是你仍然需要防止無效的狀態(變量等),因爲你永遠不知道下一個要執行的事件/回調是什麼。

0

它應該是可能的,但這需要一個數組來保存對響應和請求對象的引用。 然後你將不得不告訴模塊索引在哪裏找到數組中的對象。你也必須清理這個數組。所以你不能真正避免將一些信息傳遞給模塊。

更好地將請求和響應對象引用直接傳遞給模塊。

請記住,對象是通過引用傳遞的,因此在將對象傳遞給函數/模塊時沒有太大的開銷。

2

節點域。

這是一個老問題,我意識到,但沒有一個答案是完全正確的。

事實是,您可以通過使用節點域來實現此功能。

全局變量通常被認爲使用不好,因爲它們破壞了封裝並且正確封裝的應用程序是優秀設計的第一個構建塊,因爲應用程序將更易於閱讀,測試和重構。

這就是說,我個人遇到很多很好的使用情況在單個請求的範圍內使用全局變量。

示例 除非您將您的請求(或請求ID)暴露給它不屬於的圖層,否則無法通過多層代碼跟蹤單個請求。 (即服務,DAL等等......將您的請求保存在您的控制器中)。

基本上,通過多層傳遞變量,以便它們可以在我的應用程序的較低級別訪問是不可持續的,並且使代碼非常混亂。

在您開始尖叫之前,我知道Domains從Node 5開始已被棄用,而且我也意識到這不是Domain的確切用例,因爲它已記錄在案。但是Node現在正在完成一個新的API,希望能繼續解決這個問題。

https://nodejs.org/api/domain.html