我希望我的会话在所有视图 (*.ejs) 中都可用,而不必在每个操作上传递它。我的代码如下所示,但 req.session 对象在这里始终为 null,即使在我的"控制器"中,我可以通过指定在用户进行身份验证后访问会话对象:
req.session.whatever
我的初始化代码(当前在每个请求上执行(我用调试断点仔细检查)是:
var appendLocalsToUseInViews = function(req, res, next)
{
//append request and session to use directly in views and avoid passing around needless stuff
res.locals.request = req;
if(req.session != null && req.session.user != null)
{
res.locals.user = req.session.user;
}
next(null, req, res);
};
我在应用程序设置序言中注册了此功能:
app.use(appendLocalsToUseInViews);
我见过人们使用 app.use 方法和 dynamicHelpers。我正在使用快递 3,似乎它们已经消失了,从快递 2 中弃用了......但这似乎不是重点,因为每个请求都会正确调用该函数。如何在这种预控制器代码中访问 Express 会话?
谢谢!
解决方案感谢Jani Hartikainen:
我将代码移动到会话中间件加载并正常工作后!!这是新代码。
app.use(express.cookieParser(appSecret));
app.use(express.session({ secret: appSecret }));
---->>>app.use(appendLocalsToUseInViews);
这应该有效,但请确保您的app.use
仅在初始化会话中间件之后。如果您在会话中间件初始化之前有此内容,它将在链中先于它运行,因此数据将不可用。