Angular 4 Http Interceptor: next.handle(...). do не является функцией

Я создал этот HTTPInterceptor, чтобы иметь возможность лучше обрабатывать ошибки HTTP, он работал хорошо, прежде чем я сделал git pull и запущен npm install.

Это мой код:

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 не является функцией     в GobaeInterceptor.webpackJsonp.../../../../../src/app/services/gobae.interceptor.ts.GobaeInterceptor.intercept(gobae.interceptor.ts: 12)     в HttpInterceptorHandler.webpackJsonp.../../../common/@ angular/common/http.es5.js.HttpInterceptorHandler.handle(

Что-то, что может повлиять на мой код, изменилось в последнее время? что я могу сделать теперь, чтобы "поймать" ответ http на моем перехватчике?

+9
источник поделиться
3 ответа

Эта ошибка возникает из-за отсутствия оператора do. Ниже импортируется с патчем наблюдаемый объект с помощью оператора do.

import 'rxjs/add/operator/do';

RxJs не поставляется вместе со всеми функциями оператора по умолчанию, чтобы уменьшить размер библиотеки. Вам необходимо импортировать операторы, которые вы хотели бы использовать индивидуально.

+26
источник

Вам нужно использовать импорт.

import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import 'rxjs/Observable';
import 'rxjs/add/observable/throw';
+3
источник

В результате я изменил оператор:

next.handle(req).do

Для этого:

next.handle(req).subscribe

Кажется, что

  • Операторы из rxjs по умолчанию больше не загружаются

  • Так как Angular реализовал наблюдаемые в HTTP-вызовах, подписка - это правильный вариант

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос