【问题标题】:AngularJS promise catch 401AngularJS 承诺捕获 401
【发布时间】:2017-09-04 23:14:54
【问题描述】:

我正在使用一个非常基本的 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 时,angular 不会打印出任何内容。控制台将保持为空,只有 POST http://127.0.0.1/login 401 (Unauthorized) 提示。但是没有successcatch 作为输出。也没有finally

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

那么我如何在$http 上捕获 401?
.then 承诺不是仅用于返回 200,.catch 不是用于其他所有返回!= 200?

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

【问题讨论】:

  • 这篇旧文章我认为是一个很好的参考。您可以将 .success .error 链接起来。要不然。您可以使用 .then 并检查响应对象,它应该有一个状态代码属性,指示您是否应该拒绝或解决承诺 weblog.west-wind.com/posts/2014/Oct/24/…
  • 你使用angular-http-auth模块吗?
  • ... 或注册了任何全局$http 拦截器?
  • 是的,我有 angular-http-auth 版本为 v1.5.0。我正在使用http-auth-interceptor 模块,以便在成功登录的then 链中使用authService.loginConfirmed(response.data);。但除此之外,我只听event:auth-forbiddenevent:auth-loginConfirmedevent:auth-loginRequired$rootScope.$on(...);
  • 我的 Angular 版本中不再提供 .success.error

标签: javascript angularjs rest


【解决方案1】:

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

$http 拦截器执行以下操作:缓冲每个 HTTP 401 响应的配置对象(这是请求的 URL、有效负载和参数),并且每次发生时,都会从 @987654325 广播 event:auth-loginRequired 消息@。

禁用401拦截器设置ignoreAuthModule: true

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

模块为 401 状态创建一个处于待处理状态的新承诺。响应被缓冲,您有机会调用authService.loginConfirmed()authService.loginCancelled() 函数。第一个重试之前由于 HTTP 401 响应而失败的所有请求。当第二个取消之前由于 HTTP 401 响应而失败并缓冲的所有挂起请求时。

Docs

【讨论】:

  • 好的,这很有趣。如果 REST 抛出 403,event:auth-forbidden$http.catch 被触发。但是,如果 REST 抛出 401,则只有 vent:auth-loginRequired 是 triggert,但 $http.catch 不是。为什么捕获不起作用?它只会在 403 或 500 时触发...
  • 好问题,根据this code,在响应状态为 401 的情况下,会创建并返回新的 Promise。 catch 回调没有被调用,因为这个新的 Promise 处于挂起状态。
  • 很有趣......但只有 403 正在创建一个可以捕获的新承诺。 401 只是中断。只有ignoreAuthModule 才会进入catchfinally。这非常令人困惑......当 REST 抛出 401 时,没有finally 的承诺。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 2017-11-24
  • 2014-06-13
  • 2021-11-15
  • 2016-06-15
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
相关资源
最近更新 更多