Угловое ИСКЛЮЧЕНИЕ: нет провайдера для Http


333

Я получаю EXCEPTION: No provider for Http!в моем приложении Angular. Что я делаю не так?

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'
                })
            });

3
Вы пропали HTTP_PROVIDERS.
Эрик Мартинес

1
импорт / экспорт ... пожалуйста, кто-нибудь, что это за синтаксис?
vp_arth

5
Это синтаксис Typescript
Даниэль

10
импорт / экспорт - это синтаксис JavaScript (ES6)
alexpods

3
Было бы хорошо, если бы один из ответов на самом деле объяснил, почему мы должны импортировать HttpModuleи что он делает.
Дражен Бжеловук

Ответы:


520

Импортируйте HttpModule

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

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

platformBrowserDynamic().bootstrapModule(AppModule);

В идеале вы разделяете этот код на два отдельных файла. Для дальнейшей информации читайте:


2
В текущей бета-версии Angular2 файл называется app.ts.
d135-1r43

7
В проектах angular-cli файл называется main.ts.
filoxo

Что делать, если у меня нет NgModule? Я разрабатываю модуль angular2, и у него нет модуля NgModule, но для тестов мне нужен провайдер Http
iRaS

@ Webuster Я только что проверил. Это все еще должно работать. Можете ли вы дать мне точный код ошибки?
Филипп

2
@PhilipMiglinci ... спасибо за ценный ответ .. добавив несколько замечаний для ищущих, что файл будет app.module.ts в angular 2.0 для пояснения, это основной файл проекта, включающий модули, которые будут использовать в дальнейшем унаследованные классы.
Шаан Гола

56

> = Угловая 4,3

для введенного HttpClientModule

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

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

Angular2> = RC.5

Импортируйте HttpModuleв модуль, где вы его используете (например, здесь AppModule:

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

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

Импорт HttpModuleочень похож на добавление HTTP_PROVIDERSв предыдущей версии.


9

В выпуске Angular 2.0.0 от 14 сентября 2016 года вы все еще используете HttpModule. Ваш главный app.module.tsбудет выглядеть примерно так:

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

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

Тогда в вашем app.tsвы можете загрузить как таковой:

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

platformBrowserDynamic().bootstrapModule(AppModule);

9

Добавьте HttpModule в массив импорта в файле app.module.ts перед его использованием.

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

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


9

Начиная с п.5 вы должны сделать что-то вроде

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

platformBrowserDynamic().bootstrapModule(AppModule);


5

Импортируйте HttpModuleв ваш файл app.module.ts.

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

Также не забудьте объявить HttpModule при импорте, как показано ниже:

imports: [
    BrowserModule,
    HttpModule
  ],

4

Лучший способ - изменить декоратор вашего компонента, добавив Http в массив провайдеров, как показано ниже.

@Component({
    selector: 'greetings-ac-app2',
    providers: [Http],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})

Кто бы ни пометил это неправильно, могу ли я знать, в чем причина?
Шиванг Гупта

5
Я не отрицал, но причина, вероятно, в том, что вам не нужен новый Httpобъект для каждого компонента. Лучше иметь один для приложения, что достигается путем его импорта на NgModuleуровне.
Тед Хопп

3

Начиная с RC5 вам нужно импортировать HttpModule следующим образом:

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

затем включите HttpModule в массив импорта, как упомянуто выше Гюнтером.


3

Просто включите следующие библиотеки:

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

и включите класс http в providersраздел следующим образом:

@Component({
  selector: '...',
  templateUrl: './test.html',
  providers: [YourHttpTestService]

3

Если у вас есть эта ошибка в ваших тестах, вы должны создать Fake Service для всех сервисов:

Например:

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; }
}

И в beforeEach:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    providers: [
      Your1Service,
      Your2Service,
      { provide: Your1Service, useClass: FakeYour1Service },
      { provide: Your2Service, useClass: FakeYour2Service }
    ]
  }).compileComponents();  // compile template and css
}));

3
**

Простое решение: импортируйте HttpModule и HttpClientModule в ваш 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 { }

Это решение работает, но HttpModule помечен как устаревший в Angular 5.2. Я думаю, что некоторые компоненты не обновлены, и все еще использует старую реализацию Http.
Собван

1

Все, что вам нужно сделать, это включить следующие библиотеки в tour app.module.ts, а также включить их в ваш импорт:

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

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

1

Я столкнулся с этой проблемой в моем коде. Я только поместил этот код в мой app.module.ts.

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

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

1
Пожалуйста, не повторяйте существующие ответы. Это не добавляет ценности сообществу.
Ишервуд

1

import { HttpModule } from '@angular/http'; пакет в вашем файле module.ts и добавьте его в ваш импорт.


1

Я просто добавляю оба из них в мой app.module.ts:

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

&

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

Теперь он отлично работает .... И не забудьте добавить в

@NgModule => Imports:[] array

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.