【问题标题】:Sessions on AppFog with ExpressJS使用 ExpressJS 在 AppFog 上的会话
【发布时间】:2013-02-08 18:54:10
【问题描述】:

我的 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('/');
    });
}

安东尼

【问题讨论】:

  • 如何初始化会话管理?你用什么?饼干?雷迪斯?
  • 我用我的 app.configure() 更新了我的主题; - 我使用 cookie。
  • 所以 req.session.access 失去了它的价值。您应该使用 Chrome 中的网络检查器检查 cookie 中的值。

标签: node.js session express appfog


【解决方案1】:

如果你使用 express 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('/');
}

【讨论】:

  • 好的,但我需要在我的路线中设置会话,而不是在我的 app.configure() 中...请参阅上面的路线...
  • 您需要配置 express 以将会话放入 cookie 中,如我的回答中所示,然后您在路由中设置会话值。
  • 我更新了主题,它可以工作,但我收到一个销毁会话的错误。 TypeError: Object # 没有方法 'destroy'。
  • 使用req.session = null 清除会话变量。查看更新的答案。
  • 这取决于。即使用户已注销,您也可能希望在会话中保留一些数据,例如用户名。否则清除它就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多