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

问题描述 投票:2回答:2

我们正在使用快速4.6.1 cookie解析器1.3.2 connect-flash 0.1.1和express session 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);

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

有没有更好的方法在群集模式下执行此操作?

node.js session express pm2
2个回答
4
投票

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

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

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

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

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


0
投票

我遇到过同样的问题。从使用Express会话的内存切换到memcached后,一切都可以正常使用pm2群集模式。

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

© www.soinside.com 2019 - 2024. All rights reserved.