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
相关产品推荐
相关产品推荐

