2014-10-07 64 views
0

我是node.js中的newby,我尝试在Express中实现最简单的授权。我想从数据库设置req.session.userId到用户标识。我可以使用简单的表单和发布请求从数据库获取用户标识,但我无法设置req.session.userId。对我来说最难以理解的是 - 为什么有时候req.session正在工作,有时却不行。 我的代码解释。 在app.jsreq.session未设置发布请求

配置段:

app.use(express.session({secret: 'asdads', key: 'sid', cookie: { maxAge: 600000, httpOnly: false }})); 

之后,我处理与POST请求:

app.post('/login', routes.authorize); 

我routes.authorize:

exports.authorize = function(req, res){ 
    if(req.body){ 
     var login = req.body.login; 
     var password = req.body.password; 
    //gET USER FROM DATABASE 
     db.getUser(login, password, function(err, results){ 
    //ensure that results is correct 
      console.log(results); 
      if(err){ res.send("User not found", 500); return;} 
    //PLACE WITH BUG :) 
      req.session.userId = results[0].id; 
     }); 
    } 
    res.render('login', { title: 'Express!' }); 
} 

我认为我不能在这个地方设置req.session.userId我通过POST访问这里。如果我是对的,请帮助我在这个地方访问req.session

在此先感谢。

回答

1

我认为问题在于您在db.getUser()完成之前立即回应请求。 IIRC的Express会话中间件保存会话改变时,响应被发送,所以尝试这样的东西,而不是:

exports.authorize = function(req, res) { 
    if (!req.body) 
    return res.render('login', { title: 'Express!' }); 

    var login = req.body.login; 
    var password = req.body.password; 

    db.getUser(login, password, function(err, results) { 
    if (err) 
     return res.send("User not found", 500); 
    req.session.userId = results[0].id; 
    res.render('login', { title: 'Express!' }); 
    }); 
} 
+0

非常感谢您!我想过同步/异步执行,但我仅在第二天使用node.js,并且很难找到像这样的错误! – kimonniez 2014-10-07 13:21:53

+0

如果你在这里... :)如何做req.session.userId = results [0] .id;之后的重定向。 ?? – kimonniez 2014-10-07 13:44:07

+0

您可以使用['res.redirect()'](http://expressjs.com/4x/api.html#res.redirect)重定向。 – mscdex 2014-10-07 13:58:38