Angular 13 + Angular Fire 7项目中使用AngularFireAuthGuard遇NullInjectorError,改用AuthGuard是否合规?
首先可以明确告诉你,改用@angular/fire/auth-guard中的AuthGuard是完全正确且符合AngularFire 7.x官方设计规范的做法,甚至这是AngularFire团队推荐的新用法。
为什么之前的AngularFireAuthGuard会报错?
AngularFire 7.x做了重大的模块化重构,@angular/fire/compat/*下的内容都是为了兼容AngularFire 6及更早版本的遗留代码。AngularFireAuthGuard作为compat版本的守卫,需要依赖一系列compat版本的服务(比如AngularFireAuth的compat实现),如果你的项目中没有完整配置compat模块的依赖注入项,就会触发NullInjectorError。
而新的AuthGuard是AngularFire 7.x推出的轻量化守卫实现,它直接适配Angular的现代依赖注入系统,只要你已经在项目中正确导入了AngularFireAuthModule,就可以直接使用,不需要额外的compat配置。
关于你当前的导入组合
你现在同时使用compat目录下的redirectLoggedInTo/redirectUnauthorizedTo和新的AuthGuard是完全可行的——这些辅助函数的逻辑是通用的,不会和新守卫产生冲突。不过额外提一句:AngularFire 7.x的@angular/fire/auth-guard中也提供了同名的辅助函数,你可以考虑统一换成新的导入,让代码风格更一致:
import { redirectLoggedInTo, redirectUnauthorizedTo } from '@angular/fire/auth-guard'; import { AuthGuard } from '@angular/fire/auth-guard';
总结
放弃compat版本的AngularFireAuthGuard,改用新的AuthGuard是最优选择:
- 它是AngularFire 7.x的官方推荐API
- 不需要额外的compat配置,避免依赖注入错误
- 更贴合现代Angular的模块化和最佳实践
内容的提问来源于stack exchange,提问作者Ali Maher

