Node.js 在群集模式下运行pm2时重定向后,请求会话数据丢失
我们正在运行一个node.js应用程序,其中包含express 4.6.1 cookie parser 1.3.2 connect flash 0.1.1和express session 1.7.0 我们使用flash在重定向后在页面上显示消息,有时在req.session中存储数据,以便在用户出错并需要重新输入时自动填写表单。最近,我们开始在集群模式下使用pm2,大多数事情似乎都很好,但我们注意到,在重定向后,我们丢失了闪存数据和存储在req.session中的数据 以下是一个例子:Node.js 在群集模式下运行pm2时重定向后,请求会话数据丢失,node.js,session,express,pm2,Node.js,Session,Express,Pm2,我们正在运行一个node.js应用程序,其中包含express 4.6.1 cookie parser 1.3.2 connect flash 0.1.1和express session 1.7.0 我们使用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);
这来自一个端点,该端点在用户尝试注册但出现某种错误后接受请求。如果在没有群集模式的情况下运行,会话数据和闪存都会正确显示,但如果在群集模式下运行,它们几乎总是丢失(不总是:/)
在群集模式下是否有更好的方法来执行此操作?除非您使用Redis、Memcache或其他进程来存储会话数据,否则您将无法使用多个节点进程来处理请求。目前,您的应用程序仅使用
express session
存储会话数据,默认情况下,会话数据仅存储在内存中
请参阅上面链接中的警告部分
当您使用集群模块运行应用程序时,它将为每个应用程序实例派生不同的进程。如果您不做一些工作,这些进程就无法直接共享内存,这意味着当请求以循环方式分发到应用程序实例时,任何不在同一进程结束的请求都无法将其cookie与服务器端会话存储相关联
我建议您将会话存储更改为更适合生产的存储,如Redis或Memcache。如果你使用Redis,你可能想看看如何使用它。我也有同样的问题。从使用内存进行快速会话切换到memcached后,pm2集群模式下一切正常