Angular注入AnalyticsService报错Uncaught TypeError读取undefined属性
Angular服务注入报错
Uncaught TypeError: Cannot read properties of undefined (reading '<Class>')原因排查 问题场景
在Angular项目中将服务注入到另一服务时触发上述错误,本次报错出现在注入AnalyticsService后,日志显示其他关联模块也受影响,对应业务代码如下:
import { AnalyticsService } from '@s4y/elements/event-log-control'; import { catchError } from 'rxjs/operators'; import { Injectable } from '@angular/core'; import { AngularFireFunctions } from '@angular/fire/compat/functions'; /** * Interface with the firebase backend. */ @Injectable({ providedIn: 'root' }) export class BackendService { constructor(private _fns: AngularFireFunctions, private _log: AnalyticsService) { } /** * Call Firebase Cloud Function * * @param fName: Function Name * @param params: Function Parameter Object */ callFunction(fName: string, params: any) { const toCall = this._fns.httpsCallable(fName); // const serviceLoader = ServiceLocator.injector.get(AnalyticsService) return toCall(params) .pipe(catchError (error => { // Getting the Error details. const code = error.code; const message = error.message; const details = error.details; console.log(JSON.stringify(error)) // Do the logging!!! // this._analytics.logEvent() // console.l/og('error') // serviceLoader.logEvent({name: fName,info:{description: e, data:{params: params}}}); // throw errors on cloud functions live // check if error http 500/ 400/ 301 / throw error; })); } }
错误日志

常见触发原因
- 循环依赖:这是该类报错最高发的原因。如果
AnalyticsService自身(或其依赖链上的某个服务)反过来注入了BackendService,会形成依赖闭环,Angular依赖注入容器无法按顺序完成实例化,拿到的服务引用为undefined,读取类属性时就会抛出该错误。可以通过Injector延迟获取依赖、或重构服务逻辑拆分公共依赖打破循环。 - 服务未正确注册到依赖注入容器:
@s4y/elements/event-log-control包导出的AnalyticsService没有配置providedIn规则,也没有被加入到对应根模块/特性模块的providers数组中,容器无法找到对应的服务实例。 - 导入异常:导入
AnalyticsService的路径拼写错误、第三方包入口文件导出配置错误,会导致运行时实际导入的AnalyticsService值为undefined,注入阶段直接报错。 - 版本兼容/编译异常:
@s4y/elements包和当前项目使用的Angular大版本不匹配,或包构建时未适配Ivy编译规则,会导致服务类在运行时解析为undefined;如果项目构建配置的摇树优化规则错误,误将AnalyticsService代码剔除也会触发同类问题。 - 初始化时序问题:如果
AnalyticsService依赖的前置服务在APP_INITIALIZER阶段未完成初始化就被提前引用,也会出现类引用为undefined的报错,这类场景一般会在控制台伴随其他provider初始化相关的警告信息。
内容的提问来源于stack exchange,提问作者Philip Mutua
相关产品推荐
相关产品推荐

