【问题标题】:NodeJS: session variables shared for all clients (express-session)NodeJS:为所有客户端共享的会话变量(快速会话)
【发布时间】:2017-01-26 09:10:36
【问题描述】:

我正在使用 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');

谢谢,

【问题讨论】:

  • 你试过我的建议了吗?这很简单 - 如果有效,请关闭问题。

标签: node.js session express-session


【解决方案1】:

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

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

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 或任何其他的 use 方法 before 配置 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'));
});

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

【讨论】:

  • 这是问题的解决方案。谢谢!
  • @user1462904 你能把上面的解决方案标记为答案吗?它将帮助其他寻找相同解决方案的人找到它。
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 2020-01-19
  • 2011-08-26
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多