You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 14中useFactory提供者未调用,注入时出现NullInjectorError

Angular 14注入令牌FIRE_BASE_AUTH找不到提供者的问题解决

问题核心分析

你遇到的NullInjectorError和工厂函数未执行的问题,主要源于两个关键错误:

  • 组件注入时使用了字符串字面量'FIRE_BASE_AUTH',但模块中定义的是InjectionToken实例,两者标识不匹配,导致Angular无法定位到对应的提供者。
  • 模块静态属性firebaseAuth仅声明未初始化,即便注入匹配,工厂函数返回的也是未赋值的undefined。

分步解决方案

1. 统一注入令牌的使用

组件必须使用模块中定义的FIRE_BASE_AUTH令牌实例,而非字符串字面量:

// 先从LoginSpaModule导入令牌
import { FIRE_BASE_AUTH } from './login-spa.module';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
  constructor(
    @Inject(FIRE_BASE_AUTH) private auth: Auth, // 这里用令牌实例,而非字符串
    private router: Router
  ) { }
}

2. 正确初始化Firebase Auth实例

当前模块的静态属性firebaseAuth没有被赋值,需要补全初始化逻辑,推荐两种方式:

方式一:模块构造函数中初始化

import { initializeApp } from 'firebase/app';
import { getAuth } from 'firebase/auth';

// 替换为你的Firebase项目配置
const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  // 其他配置项
};

@NgModule({
  declarations: [LoginComponent],
  imports: [...],
  providers: [{ provide: FIRE_BASE_AUTH, useFactory: getFirebaseAuth }],
  exports: [LoginComponent]
})
export class LoginSpaModule {
  static firebaseAuth: Auth;
  
  constructor() {
    const app = initializeApp(firebaseConfig);
    LoginSpaModule.firebaseAuth = getAuth(app);
    console.log('LoginSpaModule initialized', LoginSpaModule.firebaseAuth);
  }
}

方式二:工厂函数内直接初始化(更推荐)
这种方式无需依赖静态属性,逻辑更独立解耦:

import { initializeApp } from 'firebase/app';
import { getAuth } from 'firebase/auth';

const firebaseConfig = { /* 你的Firebase配置 */ };

function getFirebaseAuth() {
  console.log('getFirebaseAuth called...');
  const app = initializeApp(firebaseConfig);
  return getAuth(app);
}

@NgModule({
  declarations: [LoginComponent],
  imports: [...],
  providers: [{ provide: FIRE_BASE_AUTH, useFactory: getFirebaseAuth }],
  exports: [LoginComponent]
})
export class LoginSpaModule {
  constructor() {
    console.log('LoginSpaModule constructor');
  }
}

3. 确认模块导入正确性

确保LoginSpaModule已经被正确导入到使用LoginComponent的上级模块中,或者LoginComponent所在的模块已经引入了LoginSpaModule,否则模块内的提供者不会生效。


验证

修改完成后重启应用:

  • 控制台应输出getFirebaseAuth called...
  • LoginComponent中不再抛出NullInjectorError,且能正常获取到Auth实例

内容的提问来源于stack exchange,提问作者Freddie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:12:40