javascript 如何为每个会话设置默认变量

1bqhqjot  于 2023-05-27  发布在  Java
关注(0)|答案(1)|浏览(132)

我已经设置了我的express/connect应用程序,以使用redis作为商店的会话:

app.use(express.session({
        secret: "secret key here",
        store: app.redisStore,
        cookie: { maxAge: 600000 }
    }));

我创建了自己的flash消息系统,具体做法如下:

module.exports = function (app) {
    'use strict';

    //set-up session messages
    app.use(function (req, res, next) {

        /* set up flash*/
        if (req.session.flash === "undefined") {
            req.session.flash = [];
        }

        res.locals.messages = function () {
            var messages = req.session.flash;
            //clear out messages
            req.session.flash = [];
            return messages;
        };
        ...

然后,基本上我只是在需要时将闪存消息对象推入闪存阵列。每次使用消息功能时,它们都会被清除。这似乎在很大程度上起作用;然而,在注销时,我使用了reproduce函数,flash变为undefined:

function logout(req, res) {
            var currentUser = req.session.currentUser;
            req.session.regenerate(function (err) {
                req.session.flash.push({"type": "info", "message": "You have been logged out."});
                console.log(currentUser + " Logged Out");
                res.redirect("/login");
                return;
            });
        }

这似乎是有道理的。重新生成删除会话,并且由于它发生在初始请求之后,因此flash变为未定义。为了避免将来出现类似的问题,我想知道是否有某种类型的会话初始化函数,我可以覆盖或挂钩到?每次启动或重新生成会话时,我都会使用它来设置一些默认会话值。
附带问题:flash真的被redis保存了吗?

06odsfpq

06odsfpq1#

为了避免将来出现类似的问题,我想知道是否有某种类型的会话初始化函数,我可以覆盖或挂钩到?每次启动或重新生成会话时,我都会使用它来设置一些默认会话值。
不,你这样做是正确的。如果你想给regenerate方法附加多个动作,那么你也可以尝试这样做:

var EventEmitter = require('events').EventEmitter;
var session_events = new EventEmitter( );

module.exports = function (app) {
    'use strict';

    //set-up session messages
    app.use(function (req, res, next) {
        var regenerate = req.session.regenerate;
        req.session.regenerate = function() {
            session_events.emit( "session_regenerated", req );
            regenerate.apply( req.session, arguments );
        };

        /* set up flash*/
        if (req.session.flash === "undefined") {
            session_events.emit( "session_initializing", req );
        }
        // other code goes here
    });
}

然后你可以简单地做:

session_events.on( "session_regenerated", function(req) {
    req.session.flash.push({"type": "info", "message": "You have been logged out."});
});
session_events.on( "session_initializing", function(req) {
    req.session.flash = [];
});

这是一个猴子补丁,虽然(至少.regenerate覆盖),所以我建议编写自己的session store,这一点也不难,因为会话只是Redis/任何其他存储中的一个条目。
附带问题:flash真的被redis保存了吗?
是的,附加到session的所有内容都将进入会话存储(在您的情况下是Redis)。

相关问题