2014-10-07 71 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