Коа-сессия восстанавливается после добавления к ней объекта?
У меня есть контроллер, который ищет персонажа, а затем делает что-то с ним, контроллер выглядит так:
router.post('/profile/characters', async ctx => {
try {
ctx.type = 'json';
let req = ctx.request;
if (!('charname' in req.body) || !('charserver' in req.body)) {
return res.json({
'success': false,
error: 'You are missing either the character name, or server'
});
}
let foundChar = await new Promise((res, rej) => {
bnet.wow.character.aggregate({
origin: 'us',
realm: req.body.charserver,
name: req.body.charname,
fields: ['items', 'talents']
}, (err, charData) => {
if (err) {
console.log(err);
return rej(err);
}
return res(charData);
});
});
if ('status' in foundChar) {
if (foundChar.status === 'nok') {
return ctx.body = {
'success': false,
error: 'There was an error looking up your character, please ensure its a US character, and has been logged into recently'
};
}
}
foundChar.items.level = foundChar.level;
foundChar.items.class = foundChar.class;
foundChar.items.thumbnail = foundChar.thumbnail;
foundChar.items.name = foundChar.name;
let {
items, talents
} = foundChar;
let specF = talents.find(x => x.selected) || {};
let charData = {
items, specF
};
if ('legs' in items || 'hands' in items || 'shoulder' in items) {
return ctx.body = {
success: false,
error: 'To verify it is your own character, please remove your (Shoulders, Hands, and Pants) from your character and try again.'
};
}
ctx.session.foundChar = foundChar; // This line here
console.log(ctx.session);
ctx.body = {
success: true,
charData
};
} catch (err) {
console.log(err);
ctx.status = err.status || 500;
ctx.body = {
message: err.message
};
}
});
Когда это обрабатывает ctx.session.foundChar = foundChar
кажется, по какой-то причине он сбрасывает мой сеанс, и запись сеанса показывает {}
вместо
{
authenticated: true,
userid: 1
...
}
Но если я изменю ctx.session.foundChar = "Hello";
<Работает просто отлично.
Я не знаю, есть ли предел данных или что-то для сеанса или что, поскольку это не было проблемой с express-session
но я пытаюсь преобразовать все это в Коа, в любом случае не уверен, почему моя сессия сбрасывается.
Пример чего foundChar
похоже
{ userid: 1,
username: 'Blah',
authenticated: true,
userLevel: 5,
hasMainCharacter: true,
foundChar:
{ lastModified: 1453702285000,
name: 'Blah',
realm: 'Mal\'Ganis',
battlegroup: 'Vindication',
class: 4,
race: 5,
gender: 0,
level: 100,
achievementPoints: 6335,
thumbnail: 'internal-record-3684/9/119507209-avatar.jpg',
calcClass: 'c',
faction: 1,
items:
{ averageItemLevel: 714,
averageItemLevelEquipped: 573,
head: [Object],
neck: [Object],
back: [Object],
chest: [Object],
wrist: [Object],
waist: [Object],
feet: [Object],
finger1: [Object],
finger2: [Object],
trinket1: [Object],
trinket2: [Object],
mainHand: [Object],
offHand: [Object],
level: 100,
class: 4,
thumbnail: 'internal-record-3684/9/119507209-avatar.jpg',
name: 'Blah' },
talents: [ [Object], [Object] ],
totalHonorableKills: 258 } }
Так что это регистрируется правильно, но после обновления страницы я больше не аутентифицируюсь и ctx.session
является {}
1 ответ
проблема
Ваша проблема, из-за использования koajs / сеанса, который
Простое основанное на cookie промежуточное программное обеспечение для Koa.
Что означает, когда ctx.session
сериализуется в json и сохраняется в cookie после каждого запроса и десериализуется перед каждым запросом.
К сожалению, cookie имеет ограниченный размер и при попытке сохранить в нем большой объект ctx.session.foundChar = foundChar
он превышает максимальный размер файла cookie и приводит к прекращению использования файла cookie сеанса.
По той же причине ctx.session.foundChar = "Hello"
работает, потому что размер json не превышает максимальный размер cookie.
Решение
Используйте хранилище на основе базы данных для сессии, хорошим выбором для этого может быть koa-session-storage.
Посмотрите слой хранения сеанса для параметров конфигурации
store
Параметр конфигурации указывает, где хранятся данные сеанса. Если опущено или установлено"cookie"
тогда данные сеанса будут сохранены в самом куки.Если вы хотите хранить данные сеанса в другом месте (например, в Mongo, Redis и т. Д.), Вы должны установить это для объекта, который предоставляет следующий API:
load (sid) - загрузить данные сеанса для данного идентификатора сеанса *
sid
- {String} идентификатор сеанса. * возвращает Promise, Thunk или генератор, который возвращает строку JSON данных объекта сеанса.save (sid, data) - сохранить данные сессии для данного идентификатора сессии *
sid
- {String} идентификатор сеанса. *data
- _ {String} данные сеанса преобразуются в строку JSON. * возвращает Promise, Thunk или генератор, который возвращается после сохранения данных.удалить (sid) - удалить данные сеанса для данного идентификатора сеанса *
sid
- {String} идентификатор сеанса. * возвращает Promise, Thunk или генератор, который возвращается после завершения удаления.В настоящее время доступны следующие слои хранения:
- MongoDB - коа-сессия-монго