2015-09-14 20 views
1

我已經構建了一些其他expressjs應用程序,但我無法找到如何將用戶模型傳遞到前端或將其作爲參數放入req中。Nodejs - 登錄到前端的用戶數據

該應用程序是一個頁面的web應用程序,所以用戶使用登錄表單張貼到/登錄:

app.post('/login', require('./app/controllers/user').login); 

控制器拾起,以處理該請求調用特定模塊:

exports.login = function (req,res) { 
    AccountHandler.login(req,function (response) { 
    if (response.code < 0) { 
     req.flash('error', response.msg); 
    } 
    else if (response.code > 0) { 
     req.flash('success', response.msg); 
    } 
    req.user = response.user; 
    res.redirect(response.url); 
    }); 
} 

這裏是模塊處理登錄,並通過將所需參數調用回調:

exports.login = function (req,callback) { 
    process.nextTick(function() { 
     User.findOne({ 'valid.email': req.body.Email }, function (err, user) { 
      if (err) { 
      callback({url: '/#login', msg: "There was an unexpected error!", code: -10}); 
      } 
      if (!user) { 
      callback({url: '/#login', msg: "No such email/password combination was found", code: -1}); 
      } 
      if (user) { 
      easyPbkdf2.verify(user.valid.salt, user.valid.password, req.body.Password, function (err, valid) { 
       if (!valid){ 
       callback({url: '/#login', msg: "No such email/password combination was found", code: -1}); 
       } 
       else{ 
       callback({user: user, url: '/', msg: "acknowledged", code: 10}); 
       } 
      }); 
      } 
     }); 
    }); 
} 

在控制器中,我說的是req.user = response.user;,它不會保留,當用戶重定向到'/'時,req.user仍然是空的。我如何將這個用戶信息保存到重定向頁面?

+0

爲什麼你不傳遞用戶ID作爲URL參數? –

+0

我不想使用url參數。我現在想,也許我可以通過使用session.user – Drakoumel

回答

0

所以解決方案是使用會話+中間件邏輯/功能。

這裏是設置(exrepssjs):

使用快速會話模塊:

var sessionMiddleware = session({ 
    resave: true, 
    saveUninitialized: true, 
    httpOnly: true, 
    genid: function(req) { 
    return uuid.v1() // I used another module to create a uuid 
    }, 
    secret: 'random secret here', 
    cookieName: 'session', // if you dont name it here it defaults to connectsid 
}); 

下創建一箇中間件,讓您的每一個如下要求(簡化處理的環節,我做一個查找用戶加班,並將其傳遞迴前端):無論是使用EJS或玉從前端的大部分時間

app.use(function(req, res, next) { 
    res.locals.success_messages = req.flash('success_messages'); 
    res.locals.error_messages = req.flash('error_messages'); 

    if (req.session && req.session.user) { 
    User.findOne({ email: req.session.user.email }, function(err, user) { 
     if (user) { 
     req.user = user; 
     delete req.user.password; // delete the password from the session 
     req.session.user = user; //refresh the session value 
     res.locals.user = user; 
     } 
     // finishing processing the middleware and run the route 
     next(); 
    }); 
    } else { 
    next(); 
    } 
}); 

現在,您可以訪問用戶u唱「用戶」變量。

0

如果我的理解是正確的,那麼res.redirect()調用實際上會導致 瀏覽器重定向到給定的url,這將導致您的快速服務器的新請求 。由於其新請求,舊的req對象不再與 相關。 我想你想要的是使用快速會話中間件來存儲登錄用戶的會話。很多很好的例子都在那裏..這裏是one

+0

通過中間件傳遞它我也認爲這也遲了一點(在我寫這個問題後)明天會給它一個去,併發佈一個例子,如果我做到了 – Drakoumel

相關問題