【问题标题】:"Cannot find http" in Error Handler Service for Angular 6Angular 6 的错误处理程序服务中的“找不到 http”
【发布时间】:2018-08-28 15:33:29
【问题描述】:

我正在尝试为基于 HTTP 拦截器的 Angular 6 应用程序构建错误处理服务。错误服务最好捕获任何 HTTP 错误并参考相应的错误代码。但是,由于我对 Observables、Subscriptions 和 Angular 的 HTTPInterceptor 不是那么坚定,所以下面的代码在编译时在控制台中给了我错误:error TS2663: Cannot find name 'http'. Did you mean the instance member 'this.http'?

这是错误处理程序:

import { ErrorHandler, Injectable } from '@angular/core';
import { HttpInterceptor, HttpClient, HttpErrorResponse } from '@angular/common/http';
import { InterceptService } from './InterceptService';
import { Http, Headers, RequestOptions } from '@angular/http';

@Injectable()
export class ErrorsHandler extends ErrorHandler {
  private data: any;
  private error: any;

  constructor(
    public http: InterceptService
  ) {
    super();
  }

  handleError(error: Error | HttpErrorResponse) {
    if (error instanceof HttpErrorResponse) {
      // Server or connection error happened
      if (!navigator.onLine) {
        console.log('Ein leichter Fehler ist vorgefallen, bitte überprüfen Sie 
          Ihre Internetverbindung!');
        }
        else {

          // TODO: Set Config for Services
          http
            .get('Put Service URL here')
            .map(res => {
              // If request fails, throw an Error that will be caught
              if (res.status < 200 || res.status >= 300) {
                throw new Error('This request has failed ' + res.status);
              } else {
                return res.json();
              }
            })
            .subscribe(
              (data) => this.data = data, // Reach here if res.status >= 200 && <= 
              299(err) => this.error = err); // Reach here if fails
        }
      } else {
        // Check the Connectivity of Services
        console.log('Bitte den folgenden Fehler debuggen', console.error);
      }
      // Log the error anyway
      console.error('bitte den folgenden Fehler debuggen: ', console.error);
    }
  }

这是拦截服务:

import { Injectable } from '@angular/core';
import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';
import { Observable } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';

@Injectable() //{providedIn: 'root'}
export class InterceptService implements HttpInterceptor {

  constructor() {}

  // intercept request and add token
  intercept(request: HttpRequest < any > , next: HttpHandler):
    Observable < HttpEvent < any >> {

      // modify request
      request = request.clone({
        setHeaders: {
          Authorization: `Bearer ${localStorage.getItem('MY_TOKEN')}`
        }
      });

      console.log("----request----");
      console.log(request);
      console.log("--- end of request---");

      return next.handle(request)
        .pipe(
          tap(event => {
            if (event instanceof HttpResponse) {
              console.log(" all looks good");
              // http response status code
              console.log(event.status);
            }
          }, error => {
            // http response status code
            console.log("----response----");
            console.error("status code:");
            console.error(error.status);
            console.error(error.message);
            console.log("--- end of response---");
          })
        );
    }
}

我不确定我是否以正确的方式使用 HTTP 拦截器,以及如何将其正确注入错误处理程序,我不知道如何修复错误;任何帮助或提示将不胜感激!

【问题讨论】:

    标签: angular typescript angular-http-interceptors


    【解决方案1】:

    错误说明了一切。在你的代码中应该是this.http

    import { ErrorHandler, Injectable } from '@angular/core';
    import { HttpInterceptor, HttpClient, HttpErrorResponse } from '@angular/common/http';
    import { InterceptService } from './InterceptService';
    import { Http, Headers, RequestOptions } from '@angular/http';
    
    
    @Injectable()
    
    export class ErrorsHandler extends ErrorHandler {
      private data: any;
      private error: any;
    
      constructor(public http: InterceptService) { super(); }
    
      handleError = (error: Error | HttpErrorResponse) => {
        if (error instanceof HttpErrorResponse) {
          if (!navigator.onLine) {
            console.log('Some Error!');
            }
            else {
              this.http
                .get('Put Service URL here')
                .map(res => {
                  if (res.status < 200 || res.status >= 300) {
                    throw new Error('This request has failed ' + res.status);
                  } else {
                    return res.json();
                  }
                })
                .subscribe(
                  (data) => this.data = data,
                  (err) => this.error = err); // Reach here if fails
            }
          } else {
            console.log('Bitte den folgenden Fehler debuggen', console.error);
          }
          console.error('bitte den folgenden Fehler debuggen: ', console.error);
        }
      }
    

    【讨论】:

    • 我之前尝试过,但后来我得到“Property 'get' does not exist on type 'InterceptService'”,我理解,但 Angular 不应该引用 InterceptService 的 Get 属性,但是HTTPInterceptor。我该如何解决这个问题?
    • 您对我的评论有什么补充意见吗?到目前为止感谢
    • 对!这个方法将被 Angular 调用。所以它不会对此有参考。我在想一件事。
    • 试试更新的代码。我已经为handleError 使用了数组函数语法,以便this 的上下文持续存在。这应该可以解决您的问题。
    • 谢谢,@SiddarthAjmera 到目前为止 - 我尝试了更新的代码,现在仍然给我以下错误:“属性 'map' 不存在于类型 'void'”。我目前正在研究如何解决该错误。当然,任何提示将不胜感激!
    猜你喜欢
    • 2018-11-30
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2013-06-19
    • 1970-01-01
    • 2021-08-09
    • 1970-01-01
    相关资源
    最近更新 更多