2014-02-23 221 views
2

我是一般的Node.js和服務器端JS的新手。Node.js有狀態服務器

我來自Java EE,我習慣於使用有狀態的對象(不是EJB,我使用CDI),例如,用於MVC。我的目標是保留一些與例如會議。

CDI中的Java EE知道下面的狀態範圍:

  • 應用範圍的(=相同Singleton模式)
  • 會話範圍(狀態保持用戶的會話生命週期,例如,在用戶登錄)
  • 對話作用域(狀態保持的識別的會話,例如購物車)
  • 閃光範圍的(狀態保持兩個請求之間)

如何使用數據庫只使用有狀態的對象來完成所有那些與節點沒有

回答

1

您需要像connect這樣的東西來跟蹤會話狀態,因爲這是最簡單的這些範圍。一旦你有了,你可以做如下事情。

  • 應用範圍的(=相同Singleton模式)
    • 設置屬性上的HTTP服務器實例:myServer.totalRequestsServed = 0
    • 或者您可以使用過程範圍的全局:global.totalRequestsServed = 0
  • 會話範圍(保留用戶會話生命週期的狀態,例如登錄用戶)
    • 使用連接會話中間件fo r這個:req.session.user = myUser
  • 對話作用域(保持狀態以用於已識別的對話,例如,一個購物車)
    • 我不完全清楚你的意思是「對話範圍」,但我會堅持這會話用戶或共享哈希對象。 session.user.shoppingCart = {}
  • 閃光範圍的(狀態保持兩個請求之間)
    • 使用無論是會議還是爲這個請求。在npm中有現有的模塊可以爲您提供像req.flash("Welcome!")這樣的助手。例如,請參見connect-flash
+0

非常感謝! ConversationScope btw是由ID(=對話ID)標識的作用域,例如長整型值,並且僅對一個會話有效。例如,它允許用戶一次有多個購物車。糟糕的用例,我知道。 – mitchkman

1

就像在Java世界中,是可擴展的,你需要任一服務器親和力或會話數據的外部存儲。將會話範圍數據存儲在服務器上(以及跨所有克隆進行復制)是不可擴展的。