在集群模式下运行pm2redirect后,req.session数据丢失

我们运行一个node.js应用程序,并使用express 4.6.1 cookie分析器1.3.2 connect-flash 0.1.1和express session 1.7.0。

我们使用Flash在redirect后在页面上显示消息,有时在req.session中存储数据,以便在用户犯错并需要重新input时自动填写表单。 最近,我们开始在集群模式下使用pm2,大多数情况似乎都能正常工作,但是我们注意到,在redirect之后,我们丢失了存储在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); 

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

有没有更好的方式在集群模式下做到这一点?

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

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

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

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

我build议将会话存储更改为更多生产就绪,如Redis或Memcache。 如果您使用Redis,则可能需要查看使用connect-redis 。