Экспресс-сессия и паспорт были настроены в моем приложении. Я заметил, что мне нужно дважды получить доступ к моему маршруту авторизации, чтобы сеанс был фактически установлен. Я указал свой полный путь входа в систему внизу этого вопроса.
Сначала я только заметил эту ошибку:
TypeError: req.session.touch is not a function
, которая, кажется, связана с этой конкретной строкой кода:
return res.status(200).json({
'message' : 'SUCCESS',
'user_id':req.user.id,
'first_name' : req.user.first_name,
'last_name' : req.user.last_name,
'username' : req.user.username,
'user_type' : req.user.permission_id,
'user_status_id' : req.user.user_status_id,
});
Когда я осмотрел объект res.req.session, я заметил, что в первый раз он выглядит так:
{ passport: {
user: "2d845888-5570-3d8f-8d08-db2d49adf186"
}
}
Однако при повторном входе в систему объект res.req.sessionвыглядит следующим образом:
{
cookie: Cookie {path: "/", _expires: Tue Oct 06 2020 12:10:02 GMT-0500 (Central Daylight Time), originalMaxAge: 31536000000, httpOnly: true}
passport: {user: "2d845888-5570-3d8f-8d08-db2d49adf186"}
id: "EtoefNcntrKuJujwUxdYMBOKGVRbcoq2"
reload: ƒ reload(callback)
req: IncomingMessage {_readableState: ReadableState, readable: false, domain: null, _events: {…}, _eventsCount: 1, …}
save: ƒ save()
}
Это происходит почти при любой другой попытке входа в систему без сбоев. Если я войду, я получу ошибку. Тогда, если я войду снова, это нормально. Если я вхожу в третий раз, я получаю сообщение об ошибке, но в четвертый раз это нормально. Это наводит меня на мысль, что это как-то связано с тем, как я удаляю сеанс при последовательных входах в систему здесь:
if (req.isAuthenticated()) {
req.logOut();
req.session.destroy();
res.clearCookie('connect.sid');
}
next();
Полный маршрут входа в систему:
router.post('/', (req, res, next)=> {
if (req.isAuthenticated()) {
req.logOut();
req.session.destroy();
res.clearCookie('connect.sid');
}
next();
},
passport.authenticate('local'),
asyncMiddleware(async(req, res, next)=>{
return res.status(200).json({
'message' : 'SUCCESS',
'user_id':req.user.id,
'first_name' : req.user.first_name,
'last_name' : req.user.last_name,
'username' : req.user.username,
'user_type' : req.user.permission_id,
'user_status_id' : req.user.user_status_id,
});
}));
Настройка моего магазинатакже следующим образом:
var sessionStore = new MySQLStore(options);
//handles cookie/session creation
app.set('trust proxy', 1); // trust first proxy
app.use(session({
secret: config.sessionKey,
resave: false,
store:sessionStore,
saveUninitialized: true,
duration:365*24*60*60*1000, //1 year in milliseconds
cookie: {
//secure: true,
maxAge:365*24*60*60*1000 //1 year in milliseconds
}
}));
Есть ли причина, по которой сеанс, по-видимому, не инициализируется при нечетных вызовах?