【问题标题】:Node.js stateful serverNode.js 有状态服务器
【发布时间】:2014-03-25 02:51:36
【问题描述】:

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

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

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

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

不使用数据库,只使用有状态对象,如何使用 Node 完成所有这些工作?

【问题讨论】:

    标签: java javascript node.js session stateful


    【解决方案1】:

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

    • 服务器亲和性可以通过 cookie 安排在基础设施级别。应用程序无需更改。
    • NodeJS 中的外部存储支持可通过express-session 中间件获得。它开箱即用地支持a number of session stores

    【讨论】:

      【解决方案2】:

      您需要connect 之类的东西来为您跟踪会话状态,因为这是这些范围中最不重要的。完成后,您可以执行以下操作。

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

      【讨论】:

      • 非常感谢! ConversationScope btw 是一个由 ID (=conversation id) 标识的范围,例如长值,并且仅对一个会话有效。例如,它允许用户一次拥有多个购物车。不好的用例,我知道。
      猜你喜欢
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2020-02-29
      • 2011-02-05
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多