在我的Angular应用程序中,我有一个登录功能。但是当我发送错误的凭据并且响应带有状态401:Bad Credentials(甚至是response.status = 401)时,它仍然会成功。
所以我得到$ notify“成功登录,然后在我的拦截器中找到html错误页面。这令人困惑。我不知道我做了什么来制造这个混乱。
this.getTokenCustom = function (user) {
$http.post('/login',
JSON.stringify({username: user.username, password: user.password}))
.then(
function success(response) {
localStorage.setItem('token', response.data.token);
$.notify({message: "Success login"},{type:'success'});
$state.go('roles');
},
function error(data) {
console.log(data);
$.notify({message: data.data.message},{type:'danger'});
}
);
};
UPD
this.getTokenCustom = function (user) {
$http.post('/login',
JSON.stringify({username: user.username, password: user.password}))
.then(
function success(response) {
localStorage.setItem('token', response.data.token);
$.notify({message: response.status + " Success login"},{type:'success'});
$state.go('roles');
},
function error(data) {
console.log(data);
$.notify({message: data.data.message},{type:'danger'});
}
);
};
答案 0 :(得分:6)
可能的原因是你可能有一个不能正确处理错误条件的自定义拦截器。
这篇文章可以指出正确的方向:http://www.jamessturtevant.com/posts/AngularJS-HTTP-Service-Success-Handler-400-Response-Code-and-Interceptors/
引用帖子:
当您处理拦截器的requestError或responseError并希望将错误传递给下一个处理程序时,您必须使用promise api拒绝该消息:
$httpProvider.interceptors.push(function($q) {
return {
'requestError': function(rejection) {
// handle same as below
},
'responseError': function(rejection) {
if (canRecover(rejection)) {
// if you can recover then don't call q.reject()
// will go to success handlers
return responseOrNewPromise;
}
// !!Important Must use promise api's q.reject()
// to properly implement this interceptor
// or the response will go the success handler of the caller
return $q.reject(rejection);
}
};
});
在Angular的Github issue上报告了类似的repository,问题与自定义拦截器没有正确处理错误条件有关。