NodeJS: переменные сеанса, общие для всех клиентов (экспресс-сессия)

Я использую экспресс-сессию для обработки переменных сеанса в приложении NodeJS. Я использую переменные сеанса для обработки авторизации входа в систему, для сохранения зарегистрированной пользовательской информации и других вещей.

Дело в том, что эти переменные сеанса являются общими для всех клиентов, похоже, что они работают как переменные экземпляра NodeJS вместо переменных сеанса для каждого клиента. Я хочу, чтобы переменные сеанса работали так, как они работают в PHP.

Это приложение получает все данные из веб-служб в приложении Laravel Back-End.

Это мой код:

Инициализирующая сессия:

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

Спасибо,

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

Если вы все еще чувствуете, что хотите настроить помощника, вы можете сделать это доступным для каждого запроса, настроив Express с использованием метода use перед вашим 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'));
});

Просто помните, что вы по-прежнему несете ответственность за хранение сессии. Вам необходимо объединить экспресс-сеансы с хранилищем (например, connect-redis или connect-mongo), чтобы сохранить данные сеанса между перезапусками. Полный список здесь: https://github.com/expressjs/session

Другие вопросы по тегам