2014-11-05 89 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