2016-02-13 57 views
1

我想通過passport.js使Node.js ajax身份驗證,我想在/login頁面顯示消息。我應該在我的護照策略中使用res.send,然後ajax調用成功結束,並將成功數據顯示在其頁面上。但我無法猜測如何使用res。在戰略。請看下面的代碼,如何在護照策略中使用res.send?

login.ejs

<div id="messages"></div> 

<!-- and there is a form, when form submitted, the ajax call executed.--> 
<!-- ...ajax method : POST, url : /login, data: {}, success:... --> 
<!-- If ajax call success, get 'result' data and display it here --> 

app.js

// and here is ajax handler 
// authentication with received username, password by ajax call 

app.post('/login', passport.authenticate('local'), 
function(req, res, next){ 
    res.redirect('/'); 
}); 

// and here is passport strategy 

    passport.use(new passportLocal.Strategy(function(userid, password, done) { 
    Members.findOne({'user_id' : userid}, function(err, user){ 

    // if user is not exist 
    if(!user){ 

     // *** I want to use 'res.send' here. 
     // *** Like this : 
     // *** res.send('user is not exist'); 
     // *** If it is possible, the login.ejs display above message. 
     // *** That's what I'm trying to it. How can I do it? 

     return done(null, null); 
    } 

    // if everything OK, 
    else { 
     return done(null, {id : userid}); 
    } 

    }) 


})); 

我搜索對谷歌某些文檔,人們通常在連接使用 '閃光()' -flash模塊,但我認爲這個模塊需要重新加載頁面,這不是我想要的,所以請幫助我,讓我知道是否有更好的方法。謝謝。

回答

2

而不是直接插入Passport中間件,您可以使用自定義回調以將req, res, next對象傳遞給Passport函數。

你可以做你的路由處理/控制類似的東西(這是直接從Passport文檔拍攝):

app.post('/login', function(req, res, next) { 
    passport.authenticate('local', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    req.logIn(user, function(err) { 
     if (err) { return next(err); } 
     return res.redirect('/users/' + user.username); 
    }); 
    })(req, res, next); 
}); 
+1

+1(我認爲這種分離值得關注的是最好在具有護照中間件處理響應直接) – robertklep

+0

如果我將代碼更改爲喜歡你的代碼,我認爲我不能使用不同的故障處理程序。不是嗎?如果郵件是2種('錯誤密碼'),('該ID不存在'),我無法使用它。但是隻能處理('用戶不存在'),因爲它確定存在或不存在通過護照策略的「用戶對象」。對? – Juntae

相關問題