Экспресс-создание новой сессии для каждого запроса

Экспресс-сессия создает новую сессию (новый идентификатор сессии) для нового запроса. И это происходит с перерывами, например, иногда для первых 3-4 обращений он будет работать нормально и продолжать использовать тот же существующий сеанс, а при 4-м попадании он создаст новый, иногда он создаст новый сеанс по первому запросу.

Также этот выпуск появляется на моем размещенном веб-сайте. Он отлично работает на локальном хосте.

Вещи, которые я уже пробовал и не работают..

  1. Экспресс-сессия создается после статических файловых маршрутов.
  2. Секрет экспресс-сессии и секрет cookieParser установлены одинаковыми.
  3. Использование app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); для фавикона.
  4. Установка очень высокого значения для поля max-age при создании файла cookie.

Ниже мой фрагмент app.js -

var passport = require('passport');
var expressSession = require('express-session');
var app = express();
app.engine('hbs', hbs.express4({
  partialsDir: __dirname + '/views/partials'
}));
app.set('view engine', 'hbs');
app.set('views', path.join(__dirname, 'views'));
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

app.use(express.static(path.join(__dirname, 'public')));
var flash = require('connect-flash');
app.use(flash());

var initPassport = require('./passport/init');
initPassport(passport);
//app.use(bodyParser.urlencoded());
app.use(cookieParser('mysecret'));
app.use(expressSession({ secret: 'mysecret', name:'user', cookie: {maxAge: 60000000}}));
app.use(passport.initialize());
app.use(passport.session());

Любая помощь будет принята с благодарностью. Спасибо.


person G.D    schedule 16.07.2016    source источник


Ответы (2)


почему бы вам не использовать MongoStore для хранения данных сеанса? может быть, это решит вашу проблему.

 app.use(session({
     secret: 'mysecret',
     resave: false,
     saveUninitialized: false,
     expires: new Date(Date.now() + (60 * 60 * 24 * 7 * 1000)),
     cookie: {  } ,
     store: new MongoStore({mongooseConnection: mongoose.connection})
 }));
person enRaiser    schedule 16.07.2016
comment
Да, я заменил код на MongoStore, и все работает. Но я до сих пор не могу понять, что вызывало проблему с хранилищем памяти OOTB. Может ли это быть из-за того, что мой хост-сервер не сохраняет сеанс в памяти, или это может быть проблемой в самом экспресс-сеансе при использовании с хранилищем памяти. Так сложно тратить время на свой старый код, когда работает новый :) - person G.D; 17.07.2016

Для тех, кто приземляется здесь для аналогичного создания нескольких сеансов, я решил свою проблему, установив для этого флага в промежуточном программном обеспечении сеанса значение false. Он сохраняет ваш файл cookie в БД только тогда, когда он был обновлен некоторыми дополнительными данными, такими как, например, электронная почта. `

saveUninitialized: false
person Genia    schedule 31.03.2021