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

NodeJS: session variables shared for all clients (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;

会话助手模块:

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');

谢谢,

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

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

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);
});

如果你仍然觉得你想设置一个助手,你可以通过使用 use 方法 before[=28 配置 Express 来为每个请求提供它=] 你的 app.get 或任何其他路由器方法 - 这是一个粗略的想法:

// 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'));
});

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