Angular 2 从未调用过拦截器映射

Angular 2 Interceptor map never called

我只是从 angular 2 Http 迁移到 HttpClient 以使用 HttpInterceptor, 我的拦截器看起来像:

return next.handle(request).map(event => {
    if (event instanceof HttpResponse) {
        if (event.ok) {
            return event.body.data;
        } else {
            throw new Error(event.body.statusCode);
        }
    }
});

在我服务的某个地方,我使用 httpClient,例如:

this._httpClient.get(url).map(data => { 
    console.log('I never called');
    return data.foo; 
});

subscribe 在我的组件中,如:

this._barservice
  .getFooData()
  .subscribe(
    foo => {
      console.log(foo);
    },
    error => {
      console.log(error);
    }
  );

但是 map 服务中的函数永远不会被调用!

您可以按原样 return HttpResponse,条件 if (event instanceof HttpResponse) 已经检查它是否是一个成功的请求。要捕获任何潜在的错误,您应该使用 catch 并检查 HttpErrorResponse:

return next.handle(request).map((event: HttpEvent<any>) => {
  if (event instanceof HttpResponse) {
    return event;
  }
}).catch(err => {
  if (err instanceof HttpErrorResponse) {
    return Observable.throw(err)
  }
})

记得导入HttpErrorResponse :)