Сеансы в AppFog с ExpressJS

У меня возникла проблема с сеансами в моем приложении ExpressJS. В локальном режиме это работает отлично, но когда я размещаю свое приложение на AppFog, у меня возникают проблемы с сессиями, иногда они теряются... В моей панели администратора.

Не знаю почему, но при обновлении страницы сеансы больше не работают...

var restrictedArea = function(req, res, next) {
    if( req.session.access )
        next();
    else
        res.redirect('/signin');
}

// Get/Post example on admin panel
app.get('/posts/add', restrictedArea, admin.addPost);
app.post('/posts/add', restrictedArea, admin.savePost);
app.post('/posts/delete', restrictedArea, admin.deletePost);
app.get('/posts/edit/:id', restrictedArea, admin.editPost);

Мой app.configure:

app.configure(function () {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
    app.use(express.static(path.join(__dirname, 'public')));
    //app.use(express.session({secret: 'some secret'}));
        app.use(express.cookieSession({
                secret: 'SECRET',
                cookie: { access: false }
            })
        );
    app.use(express.session({secret: 'some secret'}));
    app.use(app.router);
    app.use(function(req, res, next){
        res.render('404.jade', {
            title: "404 - Page Not Found",
            showFullNav: false,
            status: 404,
            url: req.url
        });
    });
});

Мой маршрут:

exports.authenticate = function(req, res) {
    if( req.body.username == user.username && req.body.password == user.password ){
        req.session.access = true;
        renderToAdminIndex(req, res);
    }else{
        req.session.access = false;
        renderToSignin(req, res, "Error, please try again!");
    }
}

функция выхода:

exports.signout = function(req, res) {
    req.session.destroy(function(){
        res.redirect('/');
    });
}

Энтони


person tonymx227    schedule 23.02.2013    source источник
comment
как вы инициализируете управление сеансом? что ты используешь? печенье? редис?   -  person Pascal Belloncle    schedule 23.02.2013
comment
Я обновил свою тему с помощью моего app.configure(); - Я использую файлы cookie.   -  person tonymx227    schedule 23.02.2013
comment
поэтому req.session.access теряет свою ценность. Вы должны проверить значения в файле cookie с помощью сетевого инспектора в Chrome.   -  person Pascal Belloncle    schedule 23.02.2013


Ответы (1)


Если вы используете экспресс 3.x, вам нужно использовать express.cookieSession:

app.configure(function () {

  ...

  app.use(express.cookieParser());
  app.use(express.cookieSession(
    { 
      secret: 'SECRET', 
      cookie: { maxAge: ... }
    }
  ));

ссылка: http://expressjs.com/api.html#cookieSession

ОБНОВЛЕНИЕ

Чтобы стереть сеанс:

exports.signout = function(req, res) {
  req.session = null;
  res.redirect('/');
}
person Tim Santeford    schedule 23.02.2013
comment
Хорошо, но мне нужно установить сеанс в моем маршруте, а не в моем app.configure()... См. мой маршрут выше... - person tonymx227; 23.02.2013
comment
Вам нужно настроить экспресс, чтобы поместить сеанс в файл cookie, как в моем ответе, затем вы устанавливаете значения сеанса в своем маршруте. - person Tim Santeford; 23.02.2013
comment
Я обновил тему, она работает, но я получаю сообщение об ошибке для уничтожения сеанса. TypeError: Object #‹Object› не имеет метода «уничтожить». - person tonymx227; 23.02.2013
comment
И добавил в тему свою функцию выхода. - person tonymx227; 23.02.2013
comment
Сотрите переменные сеанса с помощью req.session = null. Смотрите обновленный ответ. - person Tim Santeford; 23.02.2013
comment
Спасибо, это работает. Как вы думаете, это лучшая практика для уничтожения сеансов? Но я разместил свое приложение на AppFog, и оно тоже работает. Спасибо. - person tonymx227; 23.02.2013
comment
Это зависит. Вы можете захотеть сохранить некоторые данные в сеансе, такие как имя пользователя, даже если они вышли из системы. В противном случае очистить его в порядке. - person Tim Santeford; 23.02.2013
comment
что, если вы хотите сохранить сеанс в Redis ... и все же он не держит его ... - person coool; 03.11.2013