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