KĄTOWY WYJĄTEK: brak dostawcy dla HTTP

333

Dostaję EXCEPTION: No provider for Http!w mojej aplikacji Angular. Co ja robię źle?

import {Http, Headers} from 'angular2/http';
import {Injectable} from 'angular2/core'


@Component({
    selector: 'greetings-ac-app2',
    providers: [],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
export class GreetingsAcApp2 {
    private str:any;

    constructor(http: Http) {

        this.str = {str:'test'};

        http.post('http://localhost:18937/account/registeruiduser/',
            JSON.stringify(this.str),
            {
                headers: new Headers({
                    'Content-Type': 'application/json'
                })
            });
Daniel
źródło
3
Brakuje HTTP_PROVIDERS.
Eric Martinez,
1
import / eksport ... proszę, ktokolwiek, jaka to składnia?
vp_arth
5
Jest to składnia maszynopisu
Daniel
10
import / export - to składnia JavaScript (ES6)
alexpods
3
Byłoby miło, gdyby jedna z odpowiedzi faktycznie wyjaśniała, dlaczego musimy importować HttpModulei co robi.
Drazen Bjelovuk

Odpowiedzi:

520

Zaimportuj HttpModule

import { HttpModule } from '@angular/http';

@NgModule({
    imports: [ BrowserModule, HttpModule ],
    providers: [],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);

Najlepiej jest podzielić ten kod na dwa osobne pliki. Aby uzyskać więcej informacji, przeczytaj:

Philip
źródło
2
W obecnej wersji beta Angular2 plik nazywa się app.ts.
d135-1r43
7
W projektach generowanych pod kątem kątowym plik jest wywoływany main.ts.
filoxo
co jeśli nie mam NgModule? Rozwijam moduł angular2 i nie ma on modułu NgModule, ale do testów potrzebuję dostawcy HTTP
iRaS
@ Przeglądarka właśnie sprawdziłem. Powinno nadal działać. Czy możesz podać dokładny kod błędu?
Philip
2
@ PhilipMiglinci ... dziękuję za cenną odpowiedź .. dodając kilka punktów dla osób poszukujących, że plik będzie app.module.ts w wersji kątowej 2.0 dla wyjaśnienia, jest to podstawowy plik projektu zawierający moduły, które będą wykorzystywać dalsze odziedziczone zajęcia
shaan gola
56

> = Kątowy 4.3

dla wprowadzonych HttpClientModule

import { HttpClientModule } from '@angular/common/http';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule, // if used
    HttpClientModule,
    JsonpModule // if used
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Kątowe 2> = RC.5

Zaimportuj HttpModuledo modułu, w którym go używasz (tutaj na przykład AppModule:

import { HttpModule } from '@angular/http';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule, // if used
    HttpModule,
    JsonpModule // if used
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Importowanie HttpModulejest bardzo podobne do dodawania HTTP_PROVIDERSw poprzedniej wersji.

Günter Zöchbauer
źródło
9

Wraz z wydaniem Angular 2.0.0 z 14 września 2016 r. Nadal używasz HttpModule. Twój główny app.module.tswyglądałby mniej więcej tak:

import { HttpModule } from '@angular/http';

@NgModule({
   bootstrap: [ AppComponent ],
   declarations: [ AppComponent ],
   imports: [
      BrowserModule,
      HttpModule,
      // ...more modules...
   ],
   providers: [
      // ...providers...
   ]
})
export class AppModule {}

Następnie app.tsmożesz uruchomić jako taki:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/main/app.module';

platformBrowserDynamic().bootstrapModule(AppModule);
Caleb
źródło
9

Dodaj HttpModule, aby zaimportować tablicę w pliku app.module.ts przed użyciem.

import { HttpModule } from '@angular/http';

@NgModule({
  declarations: [
    AppComponent,
    CarsComponent
  ],
  imports: [
    BrowserModule,
	HttpModule  
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

Surendra Parchuru
źródło
9

Od rc.5 musisz zrobić coś takiego

@NgModule({
    imports: [ BrowserModule],
    providers: [ HTTP_PROVIDERS ],  
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);
Adrian Ber
źródło
6

ponieważ było to tylko w sekcji komentarzy, powtarzam odpowiedź Erica:

Musiałem uwzględnić HTTP_PROVIDERS

Daniel
źródło
2
... Plus, HTTP_PROVIDERS został amortyzowany. Teraz nazywa się HttpModule .. stackoverflow.com/questions/38903607/…
Mike Gledhill
5

Zaimportuj HttpModuledo pliku app.module.ts.

import { HttpModule } from '@angular/http';
import { YourHttpTestService } from '../services/httpTestService';

Pamiętaj również, aby zadeklarować moduł HttpModule w ramach importu, jak poniżej:

imports: [
    BrowserModule,
    HttpModule
  ],
poo arasan
źródło
4

Najlepszym sposobem jest zmiana dekoratora elementu poprzez dodanie Http w tablicy dostawców jak poniżej.

@Component({
    selector: 'greetings-ac-app2',
    providers: [Http],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
Shivang Gupta
źródło
Kto to źle oznaczył? Czy mogę wiedzieć, jaki jest powód?
Shivang Gupta
5
Nie przegłosowałem, ale prawdopodobnie dlatego, że nie chcesz nowego Httpobiektu dla każdego komponentu. Lepiej mieć jeden dla aplikacji, co można osiągnąć, importując go na NgModulepoziomie.
Ted Hopp
3

od wersji RC5 musisz zaimportować moduł HttpModule w następujący sposób:

import { HttpModule } from '@angular/http';

następnie dodaj HttpModule do tablicy importu, jak wspomniano powyżej przez Güntera.

klaczy
źródło
3

Wystarczy dołączyć następujące biblioteki:

import { HttpModule } from '@angular/http';
import { YourHttpTestService } from '../services/httpTestService';

i dołącz klasę http do providerssekcji w następujący sposób:

@Component({
  selector: '...',
  templateUrl: './test.html',
  providers: [YourHttpTestService]
Włącz
źródło
3

Jeśli masz ten błąd w swoich testach, powinieneś utworzyć Fałszywą usługę dla wszystkich usług:

Na przykład:

import { YourService1 } from '@services/your1.service';
import { YourService2 } from '@services/your2.service';

class FakeYour1Service {
 public getSomeData():any { return null; }
}

class FakeYour2Service {
  public getSomeData():any { return null; }
}

I przedtem Każdy:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    providers: [
      Your1Service,
      Your2Service,
      { provide: Your1Service, useClass: FakeYour1Service },
      { provide: Your2Service, useClass: FakeYour2Service }
    ]
  }).compileComponents();  // compile template and css
}));
Eksperymentator
źródło
3
**

Prosta dusza: zaimportuj HttpModule i HttpClientModule do swojego app.module.ts

**

import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';



@NgModule({
 declarations: [
   AppComponent, videoComponent, tagDirective, 
 ],
 imports: [
  BrowserModule, routing, HttpClientModule, HttpModule

],
providers: [ApiServices],
bootstrap: [AppComponent]
})
export class AppModule { }
Shashwat Gupta
źródło
To rozwiązanie działa, ale HttpModule jest oznaczony jako przestarzały w Angular 5.2. Myślę, że jakiś komponent nie został zaktualizowany i nadal używa starej implementacji HTTP.
Sobvan
1

Wszystko, co musisz zrobić, to dołączyć następujące biblioteki do tour app.module.ts, a także dołączyć je do importu:

import { HttpModule } from '@angular/http';

@NgModule({
  imports:    [ HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
fiza khan
źródło
1

W moim kodzie napotkałem ten problem. Umieszczam ten kod tylko w moim app.module.ts.

import { HttpModule } from '@angular/http';

@NgModule({
  imports:      [ BrowserModule, HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
Saurabh
źródło
1
Proszę nie powtarzać istniejących odpowiedzi. Takie postępowanie nie stanowi wartości dodanej dla społeczności.
isherwood,
1

import { HttpModule } from '@angular/http'; spakuj do pliku module.ts i dodaj do importu.

Alekya
źródło
1

Po prostu dodaję oba w moim app.module.ts:

"import { HttpClientModule }    from '@angular/common/http'; 

I

import { HttpModule } from '@angular/http';"

Teraz działa dobrze .... I nie zapomnij dodać w

@NgModule => Imports:[] array

Dibya Prakash Das
źródło