📜  错误 NullInjectorError: R3InjectorError(t)[t -> t -> t -> t]: NullInjectorError: No provider for t! (1)

📅  最后修改于: 2023-12-03 15:42:08.407000             🧑  作者: Mango

错误:NullInjectorError

当你在 Angular 应用程序中看到 NullInjectorError 错误时,这通常表示你正在尝试注入一个没有定义提供商的依赖项。这个错误通常会在你创建自己的服务或组件并在应用程序中使用它们时出现。

错误信息分析

错误信息通常看起来像这样:

NullInjectorError: No provider for MyService!

上面的错误信息告诉我们在注入 MyService 的时候出错了。这个错误通常由以下情况引起:

  1. 忘记将服务添加到模块的提供商中。
  2. 模块没有正确导入某个必要的模块。
  3. 没有正确的使用 providedIn 声明。
解决方案

以下是一些可能的解决方案。

  1. 将服务添加到模块的提供商中。

你应该确认你的服务已经被添加到了需要它的模块的提供商列表中。比如:

import { NgModule } from '@angular/core';
import { MyService } from './my-service';

@NgModule({
  declarations: [...],
  imports: [...],
  providers: [MyService],
  bootstrap: [...]
})
export class AppModule { }

当你添加了 MyService 之后,在应用程序中的任何地方都可以使用它,比如在组件中注入它:

import { Component } from '@angular/core';
import { MyService } from './my-service';

@Component({
    selector: 'app-my-component',
    template: '<h1>Welcome!</h1>',
    providers: [MyService]
})
export class MyComponent {
    constructor(private myService: MyService) { }
}
  1. 模块没有正确导入某个必要的模块。

你可能会有一个服务使用了其他需要导入的服务。确保你已经将这个服务所需的所有服务都添加到模块的导入数组中。比如:

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { HttpClientModule } from '@angular/common/http';
import { MyService } from './my-service';

@NgModule({
  declarations: [...],
  imports: [
    CommonModule,
    HttpClientModule
  ],
  providers: [MyService],
  bootstrap: [...]
})
export class AppModule { }

上面的例子中,MyService 依赖于 HttpClientModule,所以我们需要将它添加到模块的导入数组中。

  1. 没有正确的使用 providedIn 声明。

如果你的服务使用了 providedIn 属性进行自我注册,确保它被正确的配置,如下所示:

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

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

在这种情况下,服务会在根模块中自动注册,你不需要再手动将它添加到模块的提供商列表中。

总结

NullInjectorError 表示依赖注入过程中无法获取到某个依赖项,通常是因为没有将其添加到提供商列表中。你可以通过加入提供商,正确导入所需的服务,或使用 providedIn 属性对服务进行自我注册来解决这个错误。