Angular2 rxjs http.request.catch 对某些 http 错误有奇怪的行为

标签 angular http error-handling rxjs observable

我的 http 服务没有正确捕获一些 http 错误。 catch 方法有 2 个不同的响应对象(见下文)。

private fireRequest(request: Request): Observable<any> {
    return this.http.request(request)
    .switchMap((response: Response) => {
        const responseData = response.json() || [];
        return Observable.of(responseData);
    })
    .catch((response: Response) => {
        const res2 = response.json();
        // filters http errors from status 0 errors
        if (response.status && response.status > 0) {
            const res = response.json();
            return Observable.of<any>(res);
        }
        const unexpectedNetworkError = new 
              Error('commons.unexpected_network');
        return Observable.throw(unexpectedNetworkError);
    })
}

奇怪的错误行为。 (即使在 chrome 网络选项卡中我也看不到 http 正文)

// catch 404 error
{ 
  headers: Headers,
  ok: false,
  status: 0,
  statusText : "",
  type : 3,
  url : null,
  _body : ProgressEvent
}

纠正错误行为

// catch 401 error
{ 
  headers: Headers,
  ok: false,
  status: 401,
  statusText : "Unauthorized",
  type : 2,
  url : http://api.service/users,
  _body : { // json body}
}

最佳答案

我发现问题与浏览器及其 CORS 行为有关。

a) 调用成功

BROWSER                  SERVER
    | ------ preflight ---> |
    | <-- allow GET, PUT -- |
    | ------- GET req ----> |
    | <------ GET res ----- |

b) 调用失败,支持响应为 404 而不是 200

BROWSER                SERVER
    | ---- preflight ----> |
    | <------ 404 -------- |
    |                      |
    |                      |

c) 无互联网连接,服务器无响应

BROWSER                SERVER
    | ---- preflight ----> X
    |                      |
    |                      |
    |                      |

每当您对不存在的路由进行 api 调用时,浏览器都会发送预检请求 (b)。

根据您的后端错误处理策略,您可能会收到:

1) 正文中包含错误详细信息的 Http 404 代码 在这种情况下,浏览器返回一个带有 http 状态代码 0 的一般错误,而没有实际服务器的有效负载。第二次调用从未进行过,因为预 check out 错后这样做没有任何意义。

2) 预检的 Http 200 代码和实际调用的 404。 在这种情况下,一切正常。

如果没有互联网连接,问题仍然存在。

关于Angular2 rxjs http.request.catch 对某些 http 错误有奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43591307/

相关文章:

ios - Swift:网络不可用时Webview提示对话框重新加载当前页面

php - 在MySQLi中使用if/else的回显错误

java - 检查输入是否正确 java 类型

angularjs - Angular 2 安装问题

javascript - renderer2 selectRootElement() 不匹配任何元素

angular - 如何始终在今天的日期打开 PrimeNg 的 p 日历

docker - Docker 容器连接中的服务器被拒绝,我应该在测试中添加 time.Sleep(100 * time.Millisecond) 吗?

javascript - 通过 UserManager 使用服务时,User 为 Null

asp.net - 如何使用 Web API 上传文件和模型?

javascript - 如何处理引发警报框并显示AJAX错误消息的错误?