NodeJS:为所有客户端共享的会话变量(快速会话)

时间:2017-01-25 23:35:43

标签: node.js session express-session

我使用快速会话来处理NodeJS应用程序中的会话变量。我使用会话变量来处理登录授权,以保存记录的用户信息和其他东西。

问题是这个会话变量正在为所有客户端共享,看起来它们作为NodeJS实例变量而不是每个客户端的会话变量。我想要的是会话变量在PHP中工作。

此应用程序正在Laravel后端应用程序中检索Web服务中的所有数据。

这是我的代码:

初始化会话:

var sessionHelper = require('./helpers/session-helper');    
var session = require('express-session');
app.use(session({
    secret: config.SESSION_SECRET,
    resave: false,
    saveUninitialized: true,
    cookie: {secure: true}
}));
sessionHelper.init(session);
global.SESSION = sessionHelper;

session-helper module:

var _session = null;
module.exports = {
    init: function (session) {
        _session = session;
    },
    has: function (name) {
        return ((_session[name]) ? true : false);
    },
    get: function (name) {
        return _session[name];
    },
    set: function (name, value) {
        _session[name] = value;
    },
    clear: function (name) {
        _session[name] = undefined;
    }
};

使用会话变量:

SESSION.set('hotels', response.hotels);
SESSION.get('hotels');

谢谢,

1 个答案:

答案 0 :(得分:2)

问题是你已经全局缓存了helper对象中特定的会话实例。作为一般惯例,除非您非常确定该对象的生命周期和状态是如何管理的,否则这不是一个好主意。

快速会话的工作方式是快速中间件维护一个单独的会话实例每个请求。您应该通常在请求正文中访问该会话:

app.get('/', function(req, res, next) {
    var sess = req.session;

    // sess will have values specific to each unique browser session
    console.log('This session has an id of ', sess.id);
});

如果您仍然觉得要设置帮助程序,可以在 app.get或任何之前使用使用方法配置Express,使其可用于每个请求其他路由器方法 - 这里有一个粗略的想法:

// This should be AFTER the app.use statement for express sessions
app.use(function (req, res, next) {
    var sessionHelper = require('./helpers/session-helper');
    sessionHelper.init(req.session);
    req.sessionHelper = sessionHelper;
    next();
})

现在,在任何后续的路由处理程序代码中,您会发现req.sessionHelper可供使用。这是因为你告诉Express首先将你的助手添加到所有请求的请求对象中。所以,这将有效:

app.get('/', function(req, res, next) {
    console.log('Session ID: ', req.sessionHelper.get('id'));
});

请记住,您仍然负责会话存储。您需要将快速会话与商店(如connect-redis或connect-mongo)结合使用,以便在重新启动之间保持会话数据。完整列表位于:https://github.com/expressjs/session#compatible-session-stores