如何拦截非JSON

时间:2018-05-10 17:45:00

标签: javascript angular typescript

我正在使用Angular 5.1.0并尝试读取服务器发送的文件作为对GET请求的响应。

我这样做:

  getImage(imageUrl: string) {
    const httpOptions = {
      headers: new HttpHeaders({
        'Authorization': 'Basic ' + this.authService.getBasicAuthString(),
        resourceType: 'blob'
      })
    };
    return this.http.get<File>(imageUrl, httpOptions);
  }

但是,看起来,标记为固定here的错误对于5.1.0并不固定,并且我不断收到HttpErrorResponse,说它无法解析收到的响应(响应代码为200)。

我正在尝试重写5.1.0的bug中提供的解决方法,但社区并没有很快的响应。

解决方法是:

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(req).catch(event => {
      if (event instanceof HttpErrorResponse) {
        const response = event as HttpErrorResponse;
        if (response.headers.get('content-type') === 'application/json') {
          return Observable.throw(new HttpErrorResponse({
            error: JSON.parse(response.error),
            headers: response.headers,
            status: response.status,
            statusText: response.statusText,
            url: response.url,
          }));
        }
      }
      return Observable.throw(event);
    })
}

看起来不错,但问题如下: Property 'catch' does not exist on type Observable<HttpEvent<any>>

有人可以帮助我吗,因为我不是那个角色大师。

在Ritwick Dey的回答之后更新(我要求第一部分没有得到答复,因为对于其他人来说,这可能看起来不那么好了): < / p>

现在,当找到所有内容时,我不需要抛出所有其他拦截器并将原始响应返回给我的GET方法的订阅者。我不想要一次投掷,因为它再次出现同样的错误:

message: "Http failure during parsing for **logo-url**"
​
name: "HttpErrorResponse"

我想使用(),如提到here,但是当用返回返回返回Observable.throw(event); 时,我得到以下错误);

ERROR in src/app/shared/parser.interceptor.ts(16,5): error TS2322: Type 'Observable<{} | HttpProgressEvent | HttpSentEvent | HttpHeaderResponse | HttpResponse<any> | Http...' is not assignable to type 'Observable<HttpEvent<any>>'.
  Type '{} | HttpProgressEvent | HttpSentEvent | HttpHeaderResponse | HttpResponse<any> | HttpUserEvent<a...' is not assignable to type 'HttpEvent<any>'.
    Type '{}' is not assignable to type 'HttpEvent<any>'.
      Type '{}' is not assignable to type 'HttpUserEvent<any>'.
        Property 'type' is missing in type '{}'.
src/app/shared/parser.interceptor.ts(31,14): error TS2304: Cannot find name 'of'.
使用以下子句导入

OF:

import 'rxjs/add/observable/of';

1 个答案:

答案 0 :(得分:1)

您是否从rxjs导入了catch运算符?

import 'rxjs/add/operator/catch'

如果您正在使用Rxjs 5.5,请按照此https://stackoverflow.com/a/47203943/6120338

进行操作