【问题标题】:req.session data lost when after redirect when running pm2 in cluster mode在集群模式下运行 pm2 时重定向后 req.session 数据丢失
【发布时间】:2015-11-10 22:46:01
【问题描述】:

我们正在运行一个带有 express 4.6.1 cookie parser 1.3.2 connect-flash 0.1.1 和 express session 1.7.0 的 node.js 应用程序。

我们使用 Flash 在重定向后在页面上显示消息,有时将数据存储在 req.session 中,以便在用户犯错需要重新输入时自动填写表单。最近我们开始在集群模式下使用 pm2,大多数事情似乎都可以正常工作,但我们注意到在重定向后我们丢失了闪存数据和存储在 req.session 中的数据。

这是一个例子:

                req.flash("signup", errorString);
                req.session.storedData = {};
                req.session.storedData.username = "";   
                req.session.storedData.password = req.body.password;
                req.session.storedData.email = req.body.email;
                req.session.storedData.emailConfirm = req.body.emailConfirm;
                res.redirect(problemRedirectPath);

这来自在用户尝试注册后接受请求但出现某种错误的端点。如果我们在没有集群模式下运行,会话数据和闪存都会正确显示,但如果我们在集群模式下运行,它们几乎总是会丢失(并非总是:/)

在集群模式下有更好的方法吗?

【问题讨论】:

    标签: node.js session express pm2


    【解决方案1】:

    除非您使用 Redis、Memcache 和其他一些进程来存储会话数据,否则您将无法使用多个 Node 进程来处理请求。目前您的应用仅使用express-session 存储会话数据,默认情况下仅将会话数据存储在内存中。

    https://github.com/expressjs/session#sessionoptions

    请参阅上面链接中的警告部分。

    当您使用集群模块运行应用程序时,它将为每个应用程序实例派生不同的进程。如果您不做一些工作,这些进程无法直接共享内存,这意味着当请求被循环分发到应用程序实例时,任何不在同一进程中结束的请求都无法将它们的 cookie 与服务器端会话存储。

    我建议您将会话存储更改为更适合生产的东西,例如 Redis 或 Memcache。如果你使用 Redis,你可能想看看使用 connect-redis

    【讨论】:

      【解决方案2】:

      我遇到了同样的问题。从使用内存进行 Express 会话切换到 memcached 后,在 pm2 集群模式下一切正常。

      https://github.com/balor/connect-memcached

      【讨论】:

        【解决方案3】:

        始终建议应用程序永远不要将状态存储在内存中。通过使用像 pm2 这样的工具/解决方案,它是一个负载均衡器/进程管理器,它将基于算法在所有实例中分配请求,一个进程将不会包含与其他进程相同的存储在内存中的状态。解决方案是:使用外部存储,所有实例都可以共享和访问,例如 mongo/redis/sql/etc。这样所有进程都会从同一个源(不是内存,而是数据库)读取状态,从而解决问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-19
          • 1970-01-01
          • 2021-11-06
          • 2013-03-23
          • 1970-01-01
          相关资源
          最近更新 更多