Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何为每个会话设置默认变量_Javascript_Node.js_Express_Redis_Connect - Fatal编程技术网

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

Javascript 如何为每个会话设置默认变量,javascript,node.js,express,redis,connect,Javascript,Node.js,Express,Redis,Connect,我已将我的express/connect应用程序设置为使用以redis为商店的会话: app.use(express.session({ secret: "secret key here", store: app.redisStore, cookie: { maxAge: 600000 } })); 我通过以下操作创建了自己的flash消息系统: module.exports = function (app) { 'use str

我已将我的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;
        };
        ...
然后,本质上我只要在需要时将flash消息对象推送到flash数组中。每次使用消息功能时,它们都会被清除。这似乎在很大程度上是可行的;但是,在注销时,我使用了“重新生成”功能,闪存变得未定义:

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;
            });
        }
这似乎有道理。REGENATE会删除会话,因为它发生在初始请求之后,所以闪存变得未定义。为了避免将来出现类似的问题,我想知道是否有一些初始化函数可以覆盖或挂接到会话中?每次启动或重新生成会话时,我都会使用它设置一些默认会话值

旁白:flash真的在redis中保存了吗

为了避免将来出现类似的问题,我想知道是否有 有一些初始化功能的会话,我可以 覆盖或钩住?我将使用它来设置一些默认会话值 每次启动或重新生成会话时

不,你这样做是正确的。如果要将多个操作附加到
REGENATE
方法,还可以尝试以下操作:

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 = [];
});
不过,这是一个猴子补丁(至少是
.regenate
重写),所以我建议您自己编写,这一点都不难,因为会话只是Redis/任何其他存储中的一个条目

旁白:flash真的在redis中保存了吗

是的,连接到
会话的所有内容都将进入会话存储(您的例子中是Redis)