Экспресс-сессия и паспорт, требующие 2 попытки перед входом в систему. Ошибка req.session.touch не является функцией - PullRequest
0 голосов
/ 07 октября 2019

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

Сначала я только заметил эту ошибку:

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

Есть ли причина, по которой сеанс, по-видимому, не инициализируется при нечетных вызовах?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...