2014-02-23 219 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世界中,是可扩展的,你需要任一服务器亲和力或会话数据的外部存储。将会话范围数据存储在服务器上(以及跨所有克隆进行复制)是不可扩展的。