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

时间:2017-04-24 14:49:44

标签: 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}
}

1 个答案:

答案 0 :(得分:4)

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

a)成功通话

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

b)支持回复404而非200

的呼叫失败
BROWSER                SERVER
    | ---- preflight ----> |
    | <------ 404 -------- |
    |                      |
    |                      |

c)没有互联网连接,没有来自服务器的响应

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

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

取决于您可以收到的后端错误处理策略:

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

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

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