событие окончания сеанса koa

Я пытаюсь зарегистрировать сообщение, когда истекает срок действия сеанса koa. Но добавление прослушивателя для события expire, похоже, не работает для меня.

Ниже приведен пример кода. Установите 2 минуты как maxAge для сеанса.

import koa from 'koa';
import serve from 'koa-static';
import route from 'koa-route';
import session from 'koa-session';
import mount from 'koa-mount';

let pub = new koa();
let parse = new koa();
let app = new koa();

app.keys = ['test'];

const CONFIG = {
    key: 'sess',
    maxAge: 2000
};

parse.use(ctx => {
    // ignore favicon
    if (ctx.path === '/test') return;

    let n = ctx.session.views || 0;
    ctx.session.views = ++n;
    ctx.body = n + ' views';
    console.log(ctx.session);
});

pub.use(serve('./public'));

app.use(session(CONFIG,app));
app.on('expired',(key,value,ctx) => console.log(key));

app.use(mount('/',pub));
app.use(mount('/parse',parse));


app.listen(8080);

Здесь каждый раз, когда я обновляю страницу через 2 секунды в браузере, я вижу, что значение «просмотры» установлено обратно на 1, что означает, что срок действия предыдущего сеанса истек. Но оператор журнала как часть события с истекшим сроком действия не попадает. Может быть, я добавляю прослушиватель событий неправильно. Может кто-нибудь помочь?


person Rayees Km    schedule 27.06.2018    source источник


Ответы (1)


Просмотрев файлы библиотеки, koajs/session -> context.js

if (value._expire && value._expire < Date.now()) {
  debug('expired session');
  this.emit('expired', { key, value, ctx });
  return false;
}

где излучение:

emit(event, data) {
    setImmediate(() => {
      this.app.emit(`session:${event}`, data);
    });
}

Поэтому я думаю, что в вашем коде вы должны изменить имя, с которым вы пытаетесь зафиксировать событие:

app.on('session:expired',(key,value,ctx) => console.log(key));

Если ключ содержит значение, вы должны увидеть что-то напечатанное в консоли :)

person Javier Aviles    schedule 27.06.2018
comment
Пробовал и так, но не повезло. - person Rayees Km; 27.06.2018
comment
Я отлаживал библиотеку, и дело в том, что файл cookie никогда не генерирует событие истечения срока действия, потому что браузер удаляет файл cookie после истечения срока его действия. Поэтому запрос никогда не попадает на сервер с просроченным файлом cookie... - person Javier Aviles; 28.06.2018
comment
Большое спасибо, Хавьер. - person Rayees Km; 29.06.2018
comment
Вы можете отладить сценарий, упомянутый Хавьером, изменив дату истечения срока действия файла cookie, когда он установлен в браузере, с помощью инструментов разработчика. Тогда значение _expire в данных сеанса будет просрочено, но срок действия файла cookie не будет истечен, поэтому библиотека получит файл cookie, а затем увидит в данных сеанса, что срок его действия истек. Это произойдет только в производственной среде, если браузер не очистит файлы cookie с истекшим сроком действия или если кто-то попытается продлить сеанс вручную, изменив файл cookie (возможно, украденные файлы cookie?) - person Kenneth Sundqvist; 29.01.2019
comment
У меня та же проблема, что и у @RayeesKm, есть ли какое-нибудь решение? Или это поведение преднамеренное, и мы ничего не можем с этим поделать? - person L3M0L; 09.01.2020
comment
Я не совсем помню, что здесь происходило, но немного прочитав, похоже, что это было предполагаемое поведение библиотеки. Может быть, если вы вкратце объясните, в чем ваша проблема и зачем вам такое мероприятие, мы сможем помочь :) - person Javier Aviles; 09.01.2020