2

一般来说,我是 Node.js 和服务器端 JS 的新手。

我来自 Java EE,我习惯于使用有状态对象(不是 EJB,我使用的是 CDI),例如用于 MVC。我的目标是保留一些与会话相关的数据。

Java EE 中的 CDI 知道以下状态范围:

  • 应用范围(= 与单例模式相同)
  • 会话范围(为用户的会话生命周期保留状态,例如登录用户)
  • 对话范围(为已识别的对话保留状态,例如购物车)
  • Flash 范围(状态保持在两个请求之间)

如何在使用数据库的情况下使用 Node 做所有这些事情,只使用有状态的对象?

4

2 回答 2

2

您将需要像connect这样的东西来为您跟踪会话状态,因为这是这些范围中最不重要的。一旦你有了它,你可以做如下的事情。

  • 应用范围(= 与单例模式相同)
    • 在您的 HTTP 服务器实例上设置一个属性:myServer.totalRequestsServed = 0
    • 或者您可以使用进程范围的全局:global.totalRequestsServed = 0
  • 会话范围(为用户的会话生命周期保留状态,例如登录用户)
    • 为此使用连接会话中间件:req.session.user = myUser
  • 对话范围(为已识别的对话保留状态,例如购物车)
    • 我并不完全清楚您所说的“对话范围”是什么意思,但我会将其粘贴在会话用户或共享哈希对象中。session.user.shoppingCart = {}
  • Flash 范围(状态保持在两个请求之间)
    • 为此使用会话或请求。npm 中有现有的模块可以为您提供帮助,例如req.flash("Welcome!"). 例如,请参阅连接闪存
于 2014-02-23T16:46:42.730 回答
1

就像在 Java 世界中一样,要具有可扩展性,您需要服务器关联或会话数据的外部存储。在服务器上存储会话范围的数据(以及在所有克隆中复制它)是不可扩展的。

  • 服务器亲和性可以通过 cookie 安排在基础设施级别。应用程序无需更改。
  • NodeJS 中的外部存储支持可通过express-session中间件获得。它支持许多开箱即用的会话存储。
于 2015-08-11T10:22:33.107 回答