node.js сесията е недефинирана, когато redis се изчисти

Най-вероятно решението е тривиално, но нямах късмет с документите. Използвам мидълуера express-session и connect-redis session-store, така че запазва сесията до redis.

След като изчистя redis с FLUSHALL, информацията за сесията, разбира се, вече не е налична. Когато след това поискам началната си страница, се изпраща „стар sid“, който експресната сесия не може да намери в redis и в крайна сметка req.session е недефиниран. Това има смисъл до известна степен - тъй като няма информация за сесията - но не знам как да се справя с това правилно след това.

Нека помислим по-надолу по пътя; Следващата ми стъпка ще бъде да премахна стари сесии от магазина (за да освободя място за произволен трафик), ако потребителят не се върне след седмица. Така че в този сценарий бих имал същия проблем, когато потребител се върне след 2 седмици.

Така че въпросът ми е защо не създава нова сесия и не изпраща нова бисквитка на Sid, когато не намира нищо в sessionstore? Или по-добри въпроси вместо защо, как мога да постигна това?

req.session.regenerate() би бил очевидният подход, но тъй като req.session е undefined, не може да се направи :(

Благодаря за всякаква представа за тази ситуация!

/edit: това е кодът на моята сесия;

var ExpressRedisStore = require('connect-redis')(express),
sessionStore = new ExpressRedisStore({
    client:redClient
}),
app = express();
//... <- some middleware
app.use(express.bodyParser( {hash : 'md5'} ));
app.use(cookieParser);
app.use(express.session({
    store: sessionStore,
    key: "sid",
    cookie:{
        path: '/',
        httpOnly: true,
        maxAge: 3600*24*1000 //one day!
    },
    trustProxy:true,
    rollingSessions:true
}));
app.use(userHandler.middleware()); //<-- my own middleware for userManagment
                                  // here I fail because req.session is undefined

person japrescott    schedule 02.03.2014    source източник


Отговори (1)


Вашият проблем почти със сигурност е използването на експресна сесия. Не мога да разбера за какво става въпрос в този пакет (изглежда като некредитиран форк на connect), но не искате да го използвате. Express plus connect-redis ще направи всичко, което искате, включително правилно повторно генериране на сесии, когато изчистите вашия кеш или изтичат по друг начин.

Актуализирано:

Съжалявам, пропуснах, че Express/Connect са в средата на голям рефакторинг. Текущата версия на Express на npm обаче е 3.4.8, която изисква свържете 2.1.2, който не използва експресна сесия. Така че опитайте следното, за да накарате проекта си да работи:

npm uninstall --save express
npm uninstall --save express-session
npm install --save express
npm install --save connect-redis

Това трябва да ви осигури работеща инсталация и можете да следвате тази връзка за свързване за подходящи Readmes.

person Dan Kohn    schedule 02.03.2014
comment
благодаря за отговора ви, но експресната сесия е това, което е свързано от репото за свързване (github.com/senchalabs/connect) и тъй като express се основава на свързване, аз съм почти сигурен, че това е, което получавате, когато правите express.session. Така че вече е това, което предлагате. Имате ли друга идея? -› моля, вижте по-горе за настройката на моята сесия - person japrescott; 03.03.2014
comment
Мисля, че имам проблеми, защото модулите се актуализират и публикуват в npm точно в този момент. Ще проверя утре. Благодаря за вашата актуализация. Ще те държа в течение - person japrescott; 03.03.2014