Я пытаюсь сохранить значение 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 для сессии), также активное на том же хосте и порт. Я просто включил эту информацию, потому что не уверен, оказывает ли она какое-либо влияние (я предполагал, что нет).