RXJS catchError不能捕获网络故障错误

时间:2020-08-09 15:52:41

标签: angular rxjs angular-httpclient

我有一个服务方法,可以发出API发布请求以退出应用程序。

public logout(): Observable<APIResponse | ResponseError> {
    return this.http
    .post<APIResponse>(API_ENDPOINT + LOGOUT_URL, '{}', this.httpHeaders)
    .pipe(catchError((error) => {
        return of(this.handleError(error.error));
    }));
}

catchError捕获从服务器引发的所有其他有效错误。但是,当没有网络连接或服务器关闭时,它将无法工作。 有趣的是,所有这些错误均由我的拦截器正确捕获,拦截器针对特定响应进行了一些自定义处理。

谁能告诉我为什么它在拦截器中起作用但在我的服务中不起作用?我也在拦截器中使用了相同的catchError运算符。

这是内部感受器

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (req.url.endsWith('/login')) {
        return next.handle(req);
    }
    const body = JSON.parse(<string>req.body);
    const copiedReq = req.clone({ body: body });
    return next.handle(copiedReq)
        .pipe(tap(evt => { }), catchError((err: any) => {
            if (err instanceof HttpErrorResponse) {
                const httpError: HttpErrorResponse = err;
                // Custom logic ...
            }
            return of(err);
        }));
}

1 个答案:

答案 0 :(得分:1)

如果您在拦截器中使用相同的catchError,那么您描述的行为正是我所期望的。在这种情况下,错误会被拦截器吞没。

.pipe(catchError((error) => {
    return of(this.handleError(error.error));
}));

catchError在Observable流中捕获任何错误。如果错误到达拦截器,则会使用of捕获并在Observable流中发出新值。

我建议您在拦截器中使用throwError而不是of,因为这样,原始错误就会在Observable流中重新发出,并最终在您的服务中到达。