Angular 7. NullInjectorError: нет поставщика для HttpClient! Даже когда app.module имеет HttpClientModule. Как это исправить?

#angular #model-view-controller #.net-core #asp.net-core-mvc

#angular #model-view-controller #.net-ядро #asp.net-core-mvc

Вопрос:

Я использую Angular 7 и пытаюсь использовать службу, которая использует HttpClient для вызова ссылки API из моего ApiController в моем приложении .Net Core MVC. Всякий раз, когда я пытался протестировать в окне cmd после ввода ng test, он выдает ошибку, и это только для службы, которую я пытаюсь исправить:

 ProductService should be created
Error: StaticInjectorError(DynamicTestModule)[HttpClient]: 
  StaticInjectorError(Platform: core)[HttpClient]: 
    NullInjectorError: No provider for HttpClient!
  

Вот как я написал код в следующих файлах ниже:

product.service.ts

 import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, of } from 'rxjs';
import { catchError, map, tap } from 'rxjs/operators';
import { Product } from '../product';

@Injectable({
  providedIn: 'root'
})
export class ProductService {

  productsUrl = "api/ProductsAPI";

  constructor(private http: HttpClient) { }

  getProducts(): Observable<Product[]> {
    return this.http.get<Product[]>(this.productsUrl)
      .pipe(
        catchError(this.handleError<Product[]>('getProducts'))
      );
  }

  private handleError<T>(operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

      // TODO: send the error to remote logging infrastructure
      console.error(error); // log to console instead

      //// TODO: better job of transforming error for user consumption
      //this.log(`${operation} failed: ${error.message}`);

      // Let the app keep running by returning an empty result.
      return of(result as T);
    };
  }
}
  

В файле product.service есть HttpClient, и я прочитал, что он не работает, если HttpClientModule не находится в разделе импорта файла app.module, а класс product.service находится в разделе providers .

app.module.ts

 import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { ProductsComponent } from './products/products.component';

import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
import { AppRoutingModule } from './app-routing.module';
import { ProductService } from './products/product.service';

@NgModule({
  declarations: [
    AppComponent,
    ProductsComponent
  ],
  imports: [
    BrowserModule,
    HttpClientModule,
    FormsModule,
    AppRoutingModule
  ],
  providers: [ProductService],
  bootstrap: [AppComponent]
})
export class AppModule { }
  

Он по-прежнему выдает мне ошибку «Нет поставщика для HttpClientModule». Я хочу использовать product.service и импортировать его в другой компонент.

У кого-нибудь есть какие-либо предложения или ответы о том, как устранить эту проблему?

Комментарии:

1. не могли бы вы скопировать и вставить выходные данные ‘ng —version’ и поделиться своим кодом вашего файла спецификации? все работает, если вы запускаете ng serve или ng build ?

2. У меня такая же ошибка, как эта, при использовании import HttpClientModule в моем модуле, поэтому я меняю на HttpClient, и все работает нормально. Можете ли вы попробовать это

Ответ №1:

У меня есть способ устранить проблему с ошибкой nullInjetorError. Я думал, что мне нужно поместить класс HttpClientModule в раздел импорта файла app.module.ts для файла product.service, но оказывается, что я должен импортировать его в раздел импорта файла спецификации product.service.spec.ts.

product.service.spec.ts

 describe('ProductService', () => {
  beforeEach(() => TestBed.configureTestingModule({
    declarations: [ProductsComponent],
    imports: [HttpClientModule]
  })
  );
  

И когда эта проблема все еще сохраняется в product.component, я добавил класс HttpClientModule в раздел импорта файла product.component.spec.ts, m, и это устранило проблему.

product.component.spec.ts

   beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ProductsComponent],
      imports: [HttpClientModule]
    })
    .compileComponents();
  }));
  

Мне не нужно было добавлять класс HttpClientModule в раздел импорта app.module.ts, мне просто нужно было добавить его в раздел импорта файлов спецификаций, и это решило мою проблему с ‘NullInjectorError: нет поставщика для HttpClient.’ проблема.

Я надеюсь, что это может помочь тем, кто сталкивается с той же проблемой.

Ответ №2:

Я думаю, что у вас ошибка app.component.spec.ts . Вы также должны импортировать необходимые компоненты и модули для тестирования, попробуйте это:


app.component.spec.ts

 ...
TestBed.configureTestingModule({
  declarations: [ your_component ],
  imports: [ your_module ],
  providers: [ your_service ]
}).compileComponents();
  

Комментарии:

1. Хорошо, попробовал то, что вы предложили. Я запустил команду ng test, и я получил больше ошибок, чем одна. Я удалил, и это вызвано добавлением «AppModule» в разделе импорта.