$ http请求。即使状态代码为401,响应也会成功

时间:2016-06-29 13:26:15

标签: javascript angularjs http

在我的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'});
            }
        );
};

screen

1 个答案:

答案 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,问题与自定义拦截器没有正确处理错误条件有关。