NullInjectorError: R3InjectorError(AppModule) 添加提供程序后

Rij*_*ijo 1 angular

添加提供程序后,Angular 14 中也会出现 NullInjectorError

代码如下所示

应用程序模块.ts

import { LogService } from './services/log.service';
import { LogType, Config } from './interface/config';
import { loggerServiceFactory } from './logfactory';
export const config = {
  apiUrl: 'http://localhost:3000',
  logType: LogType.Default
}
 providers: [
    {provide: LogService, useFactory: loggerServiceFactory, deps:[config]}
  ],
Run Code Online (Sandbox Code Playgroud)

记录器服务工厂

import { AppConfig, LogType } from "./interface/config";
import { ClientService } from "./services/client.service";
import { LogService } from "./services/log.service";

export const loggerServiceFactory = (config: AppConfig) => {
    if(config.logType === LogType.Client) {
        return new ClientService();
    }
    return new LogService();
}
Run Code Online (Sandbox Code Playgroud)

日志服务

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

@Injectable()
export class LogService {
  protected id = 0;
  constructor() {
    this.id = Math.random() * 100;
    console.log(`LoggerService ${this.id} created`)
   }
   log(message: string) {
    console.log(`LoggerService ${this.id} log: ${message}`);
   }
}
Run Code Online (Sandbox Code Playgroud)

应用程序组件.ts

constructor(private log: LogService){
    this.log.log('App component constructor');
}
Run Code Online (Sandbox Code Playgroud)

Che*_*pan 5

在提供者数组中,您传递的是配置对象而不是依赖项,这就是您收到 NullInjection 错误的原因。

解决方法之一是您可以创建新的注入令牌并使用 useValue 方法传递值,然后将 CONFIG 依赖项传递给 LogService deps

import { InjectionToken, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';

import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { loggerServiceFactory, LogServiceToken } from './logfactory';
import { LogService } from './logservice';

export const config = {
  apiUrl: 'http://localhost:3000',
  logType: 'log',
};

export const CONFIG = new InjectionToken<typeof config>('CONFIG');

@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent, HelloComponent],
  providers: [
    { provide: CONFIG, useValue: config },
    {
      provide: LogService,
      useFactory: (config) => {
        return loggerServiceFactory(config);
      },
      deps: [CONFIG],
    },
  ],
  bootstrap: [AppComponent],
})
export class AppModule {}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@PankajParkar 兄弟。由于他声明了 const config 我认为它应该是配置类型,但是让他确认 (2认同)