AngularJS承诺捕获401

时间:2017-09-04 23:14:55

标签: javascript angularjs rest

我正在使用非常基本的angularJS代码进行用户登录:

[...]
this.login = function(email, password) {
    promise = $http.post('/login',
            {
                'email': email,
                'password': password
            });
    promise.then(function(response){
            console.log("success");
        }).catch(function(response){
            console.log("catch");
        }).finally(function(response){
            console.log("finally");
        });
    return promise;
};
[...]

当REST API生成代码为200的响应时,客户端控制台将记录success finally并且用户已登录。
当服务器生成包含403或500代码的响应时,控制台将打印出catch finally

但是当响应将使用401时,角度不会打印任何内容。控制台将保持为空,仅使用POST http://127.0.0.1/login 401 (Unauthorized)提示。但是没有successcatch作为输出。而且没有finally

在我的项目中,将使用$rootScope.$on('event:auth-forbidden', function(r) {...});全局捕获403。这就是为什么REST服务器只会在找不到内容时抛出404的原因,403当用户没有权限和/或没有登录时抛出404,而仅在登录失败时抛出401。

那我怎样才能在$http上抓到401? 不是.then承诺只返回200而.catch是其他每次返回!= 200?

我正在使用angularJS v1.6.4和angular-http-auth v1.5.0。

1 个答案:

答案 0 :(得分:2)

问题是angular-http-auth模块拦截状态为401或403的响应:

  

$http拦截器执行以下操作:缓冲每个HTTP 401响应的配置对象(这是请求的URL,有效负载和参数),每次发生时,事件:auth-loginRequired消息从$rootScope

禁用401拦截器集ignoreAuthModule: true

  

有时您可能不希望拦截器拦截请求,即使返回401或403.在这种情况下,您可以将ignoreAuthModule: true添加到请求配置中。

模块在处于401状态的待处理状态中创建新承诺。响应已缓冲,您可以调用authService.loginConfirmed()authService.loginCancelled()个函数。第一个重试由于HTTP 401响应而先前失败的所有请求。当第二个请求取消之前因HTTP 401响应而失败和缓冲的所有待处理请求。

Docs