2014-11-05 88 views
1

我正在構建一個基於angularJS的應用程序,並且正在我的nodeJS後端運行passportjs。 身份驗證有效,但錯誤處理並不像我想要的那樣精確。例如,當我查詢我的MongoDB和失敗的東西我做到以下幾點:AngularJS get passportjs策略失敗消息

節點:

response.send(406, {error: "Email already in use"}); 

角:

settingsService.saveUserOnServer($scope.settings).then(
    function (user) { 
     //Success 
     }, 
     function (response) { 
      console.log(response); 
      var error = response.data.error; 
      $cordovaToast.show(error, 'short', 'bottom'); 
     }); 

這將敬酒「電子郵件已在使用」。我想有相同的功能使用passportjs時:

// if no user is found, return the message 
if (!user) 
    return done(null, false, {message: 'No user found'}); 

這是我得到的角響應:

Object {data: "Unauthorized", status: 401, headers: function, config: Object, statusText: "Unauthorized"} 

我怎樣才能找回「找不到用戶」的消息?提前致謝!

+0

請不要濫用HTTP狀態代碼。 406表示服務器無法根據客戶端發送的**「Accept」頭**完成請求,意思是「不可接受」,請參閱http://www.w3.org/Protocols/rfc2616/rfc2616 -sec10.html。至於問題本身,你確定通過電線發送了什麼?使用調試代理或網絡嗅探器來檢查實際的響應,可能是干擾... – mnemosyn 2014-11-05 15:47:23

+0

我正在尋找一個正確的狀態碼,但是能夠找到一個正確的1,是不是有一個可接受的一般? – Jdruwe 2014-11-05 16:24:35

+0

確實很棘手。在「電子郵件已在使用中」的情況下,我們可以選擇HTTP 409「衝突」,但如果電子郵件在URL中,我認爲它確實是正確的。否則,WebDAV的非常通用的422「不可處理的實體」是我認爲的一個很好的默認值(服務器理解的請求但因語義原因而被拒絕)。 – mnemosyn 2014-11-05 16:37:41

回答

0

通過使用自定義的回調修正它:

app.post('/login', function (req, res, next) { 
    passport.authenticate('local-login', function (err, user, info) { 
     console.log(info); 
     if (err) { 
      return next(err); 
     } 

     if (!user) { 
      res.send(401, info); 
     } 
     req.logIn(user, function (err) { 
      if (err) { 
       return next(err); 
      } 
      res.send(user); 
     }); 
    })(req, res, next); 
}); 

explanation