Node.js, express-session, express-mysql-session данные сессии записываются в устаревшую сессию
Давно не могу решить проблему: при переходе на главную страницу сайта выполняется GET-запрос, но в нём просроченная сессия и в неё записываются данные, потом в app.use создаётся новая сессия, но данные были записаны в другую, поэтому новая сессия практически пустая, это и приходит на клиент (в браузер). Подскажите пожалуйста как решить проблему. Код следующий:
const mysql = require("mysql");
const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')
const session = require('express-session')
const MySQLStore = require('express-mysql-session')(session)
const sessionStore = new MySQLStore({
createDatabaseTable: false,
schema: {
tableName: 'sessions_storage',
columnNames: {
session_id: 'session_id',
expires: 'expires',
data: 'data'
}
}
}/* session store options */, gPool);
// Инициализация сессии
let secretKey = 'key123'
app.use(cookieParser(secretKey));
app.use('/', (request, response, next) => { // проверочный для тестирования
let session = request.sessionID
console.log('use-1 session:', session)
next()
})
app.use('/',
session({
name: 'vanilla.ru-session',
store: sessionStore,
domain: 'localhost',
cookie: {maxAge: 3600 * 1000 * 24},
secret: secretKey,
httpOnly: true,
resave: true,
saveUninitialized: true,
})
)
app.use('/', (request, response, next) => { // проверочный для тестирования
let session = request.sessionID
console.log('use-2 session:', session)
next()
})
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.get('/', (request, response) => {
console.log('======================= GET-main =======================')
request.session.counter = request.session.counter || 0
request.session.counter += 1
let date = getDate()
try {
let session = request.sessionID
console.log('session:', session)
if(session && request.session){
let timestamp = request.session.timestamp
if(!request.session.fails && request.session.fails != 0){request.session.fails = 4}
else if(timestamp){
let nowTime = Math.floor(Date.now() / 1000)
let passed = nowTime - timestamp
console.log('passed:', passed)
if(passed > 10){request.session.fails = 4; request.session.timestamp = null}
}
response.render('pageMain')
console.log('response-pageMain отправлен')
}
else {throw new Error('ошибка сессии.')}
}
catch(err){
console.log('err-GET-main', err)
response.render('pageMain')
saveErrLog(err, date, `GET-main`, 'errorLogs_Get_Post')
}
})
app.post('/main', (request, response) => {
console.log('======================= POST-main =======================')
let date = getDate()
try {
let session = request.sessionID
console.log('session:', session)
// здесь убрал ненужный код
}
catch(err){
console.log('err-POST-main', err)
response.status(500).send('Ошибка!')
saveErrLog(err, date, `POST-main`, 'errorLogs_Get_Post')
}
})
Вывод в терминал:
- Сервер запущен: http://localhost:3000
- use-1 session: undefined
- use-2 session: 2_v5Zf86d7r-BqyhyRvYscUS4z0T9zrY
- ======================= GET-main =======================
- session: 2_v5Zf86d7r-BqyhyRvYscUS4z0T9zrY
- response-pageMain отправлен
- use-1 session: undefined
- use-2 session: 0hgMKJSBiH9Wozh_4bK50JbTo-xGEeCm
- ======================= POST-main =======================
- session: 0hgMKJSBiH9Wozh_4bK50JbTo-xGEeCm