Проблема с сохранением сессии в ExpressJS - PullRequest
0 голосов
/ 18 января 2020

Я пытаюсь сохранить значение playerId в моем сеансе для expressJs. Моя настройка следующая:

//Session Configuration
server.use(session({
    name: 'pubgstats.sid',
    secret: 'SOME-SECRETS-HERE',
    resave: false,
    saveUninitialized: false,
    cookie: {
        maxAge: COOKIE_MAX_AGE,
        secure: false, // change in production
        sameSite: true,
        httpOnly: true
    },
    store: new connectMemcached({
        hosts: ['127.0.0.1:11211'],
        secret: 'SOME-OTHER-SECRETS-HERE'
    })
}));

, где COOKIE_MAX_AGE = 3600 или 1 час. У меня есть маршрутизатор с именем api, который установлен на пути /api. Для любого запроса POST на /api/* существует обработчик, который проверяет, присутствует ли определенное ключевое слово в свойстве req.originalUrl. Если это так, то он проверяет req.body на наличие определенного значения (в данном случае, playerName). Если он присутствует и сеанса не существует, то playerId ищется из API и сохраняется в сеансе. Настройка сеанса выглядит следующим образом:

req.session.playerId = playerId;
req.session.playerName = req.body.playerName;
console.log('Session');
console.log(req.session);
req.session.save(e => {
    if(e) {
        console.log('[x] Error while saving session');
        console.error(e);
    }
    nxt();
});

На консоли не сообщается об ошибках при отправке первого запроса. Обработчик запроса извлекает playerName, playerId из req.session и seasonId из req.body. Затем он просматривает некоторые статистические данные и возвращает ответ, используя метод res.json.

Теперь моя цель - идентифицировать игрока, используя playerId в следующем запросе к той же конечной точке, чтобы я мог сократить один вызов API. Я использую curl для запроса конечных точек. Вот пример первого запроса:

curl -X POST -H 'Content-Type:application/json' -d '{"playerName":"White-Mickey","seasonId":"division.bro.official.pc-2018-01"}' -c cookie.txt http://localhost:4200/api/getPlayerSeasonLifetimeStatsclear

Обратите внимание, что я сохраняю флаг cook ie с -c в файле cook ie .txt. Для следующего запроса к той же конечной точке я удаляю playerName (так как сеанс сохранен, и в последнем запросе я нашел playerId). Отправляется следующий запрос:

curl -X POST -H 'Content-Type:application/json' -d '{"seasonId":"division.bro.official.pc-2018-01"}' -b cookie.txt http://localhost:4200/api/getPlayerSeasonLifetimeStats

Теперь проблема в том, что когда объект req.session выводится на экран (см. Код выше), он выглядит как последний сеанс и определяет новый сеанс (представления где 1, должно быть два). Кроме того, запрос отклоняется, поскольку в теле запроса отсутствует playerName.

Что я пробовал до сих пор?

Попытка изменить res.json на res.send безрезультатно. Явное сохранение сеанса (в коде выше), чтобы гарантировать сохранение сеанса. Я что-то здесь упускаю?

РЕДАКТИРОВАТЬ Еще одна информация, которую я хотел бы добавить, - это то, что существует хранилище Memcached (не хранилище connectMemcached для сессии), также активное на том же хосте и порт. Я просто включил эту информацию, потому что не уверен, оказывает ли она какое-либо влияние (я предполагал, что нет).

...