2017-08-23 49 views
9

我創造了這個HTTPInterceptor才能夠更好地處理HTTP錯誤,這是工作之前我也做了一個混帳拉就跑NPM安裝。角4的Http攔截:next.handle(...)做的是不是一個函數

這是我的代碼:

import {Injectable} from '@angular/core'; 
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse} from '@angular/common/http'; 
import {Observable} from "rxjs"; 
import {ToasterService} from "angular2-toaster"; 

@Injectable() 
export class GobaeInterceptor implements HttpInterceptor { 
    constructor(private toasterService: ToasterService){ 
    } 
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     return next.handle(req) 
      .do(event => { 
       if (event instanceof HttpResponse) { 
        let response = event.body; 
        if(response.Error){ 
         this.toasterService.pop('error', 'Error '+response.Code, response.Message); 
        } 
       } 
      }); 
    } 
} 

,這是錯誤我得到:

TypeError: next.handle(...).do is not a function at GobaeInterceptor.webpackJsonp.../../../../../src/app/services/gobae.interceptor.ts.GobaeInterceptor.intercept (gobae.interceptor.ts:12) at HttpInterceptorHandler.webpackJsonp.../../../common/@angular/common/http.es5.js.HttpInterceptorHandler.handle (

做了一些會影響我的代碼最近改變了嗎?現在我能做些什麼來「捕捉」攔截器上的http響應?因爲你缺少do運營商拋出

+0

如果攔截器的提供者仍然存在,那麼最好只是比較拉或拉之後的代碼,或者拉之後更改哪些文件。因爲我猜模塊供應商缺失。甚至httpclientmodule –

回答

26

此錯誤。下面的導入使用do運算符修補可觀察對象。

import 'rxjs/add/operator/do'; 

RxJs默認不包含所有運算符函數以減少庫大小。您需要導入您想單獨使用的操作員。

+0

我得到這個,我已經在我的攔截文件。這是否需要添加到進行http調用的任何單元測試? (也就是每個單元測試都有一個get/post/put/delete /等) – ganders

0

我結束了從這種不斷變化的運營商:

next.handle(req).do 

要這樣:

next.handle(req).subscribe 

看來:

  1. 從rxjs

    運營商默認不加載了

  2. 角以來已實施了HTTP調用觀測,訂閱是正確的去

3

你不得不使用進口。

import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/Observable'; 
import 'rxjs/add/observable/throw';