在群集模式下运行pm2时重定向后req.session数据丢失

时间:2015-11-10 22:46:02

标签: node.js session express pm2

我们正在运行带有快速4.6.1 cookie解析器1.3.2 connect-flash 0.1.1和express 1.7.0的node.js应用程序。

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

以下是一个例子:

                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);

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

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

我建议您将会话存储更改为更准备生产的内容,例如Redis或Memcache。如果您使用Redis,可能需要查看使用connect-redis

答案 1 :(得分:0)

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

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