没有Http StaticInjectorError提供程序


75

我试图从api中提取数据,并在ionic应用程序中填充它,但是当我进入应该填充数据的页面时,它崩溃了。以下是我的两个.ts文件:

import { Component } from '@angular/core';

import { NavController, LoadingController } from 'ionic-angular';
import { RestService } from '../../providers/rest-service/rest-service';

@Component({
  selector: 'page-all-patients',
  templateUrl: 'all-patients.html',
  providers: [RestService]
})
export class AllPatientsPage {
  data: any;
  loading: any;

  constructor(public navCtrl: NavController, public restService: RestService, public loadingCtrl: LoadingController) {

    this.loading = this.loadingCtrl.create({
      content: `
        <ion-spinner></ion-spinner>`
    });
    this.getdata();
  }

  getdata() {
    this.loading.present();
    this.restService.getJsonData().subscribe(
      result => {
        this.data=result.data.children;
        console.log("Success: " + this.data);
      },
      err => {
        console.error("Error : " + err);
      },
      () => {
        this.loading.dismiss();
        console.log('getData completed');
     }
   );
 }
}

和另一个文件:

import { Http } from '@angular/http';
import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';

/*
  Generated class for the RestServiceProvider provider.

  See https://angular.io/guide/dependency-injection for more info on providers
  and Angular DI.
*/

@Injectable()
export class RestService {

  constructor(public http: Http) {
    console.log('Hello RestServiceProvider Provider');
  }

  getJsonData() {
    // return Promise.resolve(this.data);

     return this.http.get('url').map(res => res.json());
   }

}

我也尝试过使用HttpModule,但这是一个致命错误。错误如下所示:

Error: Uncaught (in promise): Error: StaticInjectorError[Http]: 
  StaticInjectorError[Http]: 
    NullInjectorError: No provider for Http!
Error: StaticInjectorError[Http]: 
  StaticInjectorError[Http]: 
    NullInjectorError: No provider for Http!
    at _NullInjector.get (http://lndapp.wpi.edu:8100/build/vendor.js:1276:19)

我不确定为什么没有提供程序错误,因为这是通过ionic框架创建的提供程序

Answers:


135

为了在您的应用程序中使用Http,您需要将HttpModule添加到您的app.module.ts中:

import { BrowserModule } from '@angular/platform-browser';
import { NgModule, ErrorHandler } from '@angular/core';
import { HttpModule } from '@angular/http';
...
  imports: [
    BrowserModule,
    HttpModule,
    IonicModule.forRoot(MyApp),
    IonicStorageModule.forRoot()
  ]

编辑

如以下评论中所述,现在HttpModuledeprecateduse import { HttpClientModule } from '@angular/common/http';确保HttpClientModule在您的imports:[]阵列中


1
我已将其添加到app.module.ts中,但现在出现错误:Cannot find name 'IonicStorageModule'.
Drew

1
您必须从'@ ionic / storage'导入import {IonicStorageModule};。上面只是一个样本,如果您不想要,可以将其删除
Sajeetharan

我确实在那里,但是当我删除它时,它就可以了。谢谢!
Drew

7
HttpModule现在似乎已被弃用,请import { HttpClientModule } from '@angular/common/http';改用并确保HttpClientModule在您的imports:[]数组中使用此 名称。
АлександрФишер

确保将您的服务也包含在[提供者]列表中,如下面的答案stackoverflow.com/a/52791929/2023941所示,然后重新启动编译器。
intotecho

41

更新:Angular v6 +

对于从较早版本(Angular v2-v5)转换的Apps:不建议使用HttpModule,您需要将其替换为HttpClientModule,否则也会收到错误消息。

  1. 在您的app.module.ts中import { HttpModule } from '@angular/http';,用新的HttpClientModule替换。import { HttpClientModule} from "@angular/common/http"; 注意:确保imports[]通过删除旧的HttpModule并用new替换它来更新modules数组HttpClientModule
  2. 在您使用HttpModule的任何服务中,将其替换 import { Http } from '@angular/http';为新的HttpClientimport { HttpClient } from '@angular/common/http';
  3. 更新您处理Http响应的方式。例如-如果您的代码如下所示

    http.get('people.json').subscribe((res:Response) => this.people = res.json());

上面的代码示例将导致错误。我们不再需要解析响应,因为它已经作为JSON在配置对象中返回。

订阅回调将数据字段复制到组件的config对象中,该对象在组件模板中是数据绑定的以便显示。

有关更多信息,请参见- -Angular HttpClientModule-官方文档


1
遇到错误NullInjectorError: No provider for HttpClient!
Nitin S

8

您还需要将HttpClientModuleAngular中的'@angular/common/http'导入到主AppModule中以发出HTTP请求。

app.module.ts

import { HttpClientModule } from '@angular/common/http';
import { ServiceService } from '../../../services/service.service';

@NgModule({
   imports: [
       HttpClientModule
   ],
   providers: [
       ServiceService
   ]
})
export class AppModule {...}

2

将这两个文件添加到 app.module.ts

import { FileTransfer } from '@ionic-native/file-transfer';
import { File } from '@ionic-native/file';

之后,在提供者中声明这些。

providers: [
    Api,
    Items,
    User,
    Camera,
    File,
    FileTransfer];

这对我来说是工作。


您能通过选择代码块并单击{}编辑工具栏中的图标来标记代码块吗?谢谢!:)
pmos

2

我在一个有角项目中(不幸的是)使用源代码包含通过tsconfig.json来连接不同的代码集合。我在服务中遇到了类似的StaticInjector错误(例如RestService,在最上面的示例中),并且deps在模块中提供受影响的服务时,能够通过在阵列中列出服务依赖项来解决该错误,例如:

import { HttpClient } from '@angular/common/http';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { RestService } from 'mylib/src/rest/rest.service';
...
@NgModule({
  imports: [
    ...
    HttpModule,
    ...
  ],
  providers: [
    {
      provide: RestService,
      useClass: RestService,
      deps: [HttpClient] /* the injected services in the constructor for RestService */
    },
  ]
  ...

好一个!您能否解释一下“通过tsconfig.json包含源代码”?
Harkal

1

在ionic 4.6中,我使用以下技术,并且可以正常工作。我正在添加此答案,以便如果有人在较新的离子版本应用程序中遇到类似问题,则可能会对他们有所帮助。

i)打开app.module.ts并添加以下代码块以导入HttpModule和HttpClientModule

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

ii)在@NgModule导入部分中,添加以下行:

HttpModule,
HttpClientModule,

因此,在我的情况下,@ NgModule看起来像这样:

@NgModule({
  declarations: [AppComponent ],
  entryComponents: [ ],
  imports: [
    BrowserModule,
    HttpModule,
    HttpClientModule,
    IonicModule.forRoot(),
    AppRoutingModule, 
  ],
  providers: [
    StatusBar,
    SplashScreen,
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
  ],
  bootstrap: [AppComponent]
})

而已!


0

我试图解决此问题大约一个小时,并试图重新启动了服务器。只看到问题已解决。

如果您对APP模块进行了更改,但问题仍然存在,请停止服务器并尝试再次运行serve命令。

使用带角度7的离子4

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.