NodeJS:为所有客户端共享的会话变量(express-session)

Osc*_*nez 3 session node.js express-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;
Run Code Online (Sandbox Code Playgroud)

会话帮助模块:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

使用会话变量:

SESSION.set('hotels', response.hotels);
SESSION.get('hotels');
Run Code Online (Sandbox Code Playgroud)

谢谢,

Syl*_*ero 6

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

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

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);
});
Run Code Online (Sandbox Code Playgroud)

如果您仍然觉得想要设置一个助手,您可以通过在app.get 或任何其他路由器方法之前使用use方法配置 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();
})
Run Code Online (Sandbox Code Playgroud)

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

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

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