2012-08-31 60 views
20

使用的NodeJS護照,我是測試出來的時候發生了錯誤條件使用下面的代碼會發生什麼:的NodeJS護照驗證回調不被稱爲

passport.use(new LocalStrategy(
    function(username, password, done) { 
    // asynchronous verification, for effect... 
    process.nextTick(function() { 
     findByUsername(username, function(err, user) { 
    console.log('in auth function'); 
     return done('errortest'); 
     if (err) { return done(err); } 
     if (!user) { 
      return done(null, false, { message: 'Unknown user ' + username }); 
     } 
     if (user.password != password) { 
      return done(null, false, { message: 'Invalid password' }); 
     } 
     return done(null, user); 
     }) 
    }); 
    } 
)); 

app.get('/logintest', function(req, res, next) { 
console.log('before authenticate'); 
    passport.authenticate('local', function(err, user, info) { 
console.log('authenticate callback'); 
    if (err) { return res.send({'status':'err','message':err.message}); } 
    if (!user) { return res.send({'status':'fail','message':info.message}); } 
    req.logIn(user, function(err) { 
     if (err) { return res.send({'status':'err','message':err.message}); } 
     return res.send({'status':'ok'}); 
    }); 
    })(req, res, next); 
}); 

使用路由/ logintest用戶名=鮑勃&密碼= S?我希望在控制檯中看到「驗證之前」,然後「驗證功能」,然後「驗證回調」,但它只顯示前兩個「errortest」,並在瀏覽器中顯示「errortest」。

我也試過return done({'message':'test'});,並且在控制檯和瀏覽器中顯示「[object object]」。

這是行不通還是我錯過了什麼?

編輯:按照賈裏德·漢森的迴應,增加這個錯誤處理功能的第三個參數app.get()讓我趕上了錯誤並返回相應的JSON:

... 
    })(req, res, next); 
    }, 
    function(err, req, res, next) { 
    // failure in login test route 
    return res.send({'status':'err','message':err.message}); 
    }); 

回答

14

你理解它完美無瑕,而且它的工作如預期。

如果發生任何錯誤,護照立即next()的那個錯誤。如果您想以自定義方式處理該錯誤,則可以使用錯誤處理中間件(詳細信息:http://expressjs.com/guide/error-handling.html)。

自定義回調主要用於處理驗證成功或失敗(user == false)。錯誤(如數據庫連接等)不會傳遞迴回調用於上述錯誤處理中間件。我考慮過改變這一點,但還沒有找到令人信服的理由。但是,如果你有一個不在上面的用例,請告訴我。

+1

感謝您的快速反應。我對node.js相當陌生,但用例通過jquery ajax調用進行登錄。我想返回一個json對象,其狀態爲:'ok'成功,'失敗'用戶名/密碼錯誤,'err'如果發生錯誤。 (請注意我爲成功所做的代碼編輯。) – KevinVictor

+0

因此,當自定義回調被調用時,err是否始終爲空? – KevinVictor

+0

發佈了關於GitHub問題的後續工作,所以我可以更好地對代碼進行格式化。 https://github.com/jaredhanson/passport-local/issues/15 –

4

bodyparser.json()引起了我的問題,我固定它通過這樣的設置是每路線(特別是護照上的路線):

app.post('/login', bodyParser.urlencoded({ extended: true }), function (req, res, next) { 
      passport.authenticate('local', function (err, user, info) { 
       if (err) { return next(err) } 
       if (!user) { 
        console.log('bad'); 
        req.session.messages = [info.message]; 
        return res.redirect('/login') 
       } 
       req.logIn(user, function (err) { 
        console.log('good'); 
        if (err) { return next(err); } 
        return res.redirect('/'); 
       }); 
      })(req, res, next); 
    });