【问题标题】:NodeJS + session object in ALL views without passing it on all controller actions所有视图中的NodeJS +会话对象,而不将其传递给所有控制器操作
【发布时间】:2013-09-12 13:40:19
【问题描述】:

我希望我的会话在所有视图 (*.ejs) 中都可用,而不必在每个操作中传递它。我的代码如下所示,但 req.session 对象在这里始终为空,即使在我的“控制器”中,我可以在用户通过身份验证后访问会话对象,方法是:

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。我正在使用 express 3,似乎它们已经消失,从 Express 2 中弃用......但这似乎不是重点,因为每个请求都正确调用了该函数。如何在这种预控制器代码中访问 Express 会话?

谢谢!

解决方案感谢 Jani Hartikainen:

我将代码移到了会话中间件加载并运行之后!!!这是新代码。

    app.use(express.cookieParser(appSecret));
    app.use(express.session({ secret: appSecret }));

    ---->>>app.use(appendLocalsToUseInViews);

【问题讨论】:

    标签: node.js session


    【解决方案1】:

    这应该可行,但请确保您的app.use 仅在您初始化会话中间件之后。如果在会话中间件初始化之前有这个,它将在链中运行在它之前,因此数据将不可用。

    【讨论】:

    • 该死的人,你是救命恩人!!!非常感谢,这就是问题所在!我将代码移到了会话中间件加载并工作之后!!!这是新代码。 app.use(express.cookieParser(appSecret)); app.use(express.session({ secret: appSecret })); app.use(appendLocalsToUseInViews);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多