Angular TypeError:无法读取undefined的'then'属性——JHipster AuthGuard问题
排查JHipster AuthGuard中
Cannot read property 'then' of undefined错误 我仔细看了你的代码,问题根源出在Principal服务的identity()方法里——当用户身份还未初始化(也就是this.userIdentity为undefined)时,这个方法没有返回任何Promise实例,导致你在AuthGuard里调用principal.identity().then()时,因为identity()返回了undefined,自然就找不到then方法,触发了报错。
问题代码分析
先看你Principal类里的identity()方法:
identity(force?: boolean): Promise<any> { if (force === true) { this.userIdentity = undefined; } // 当已有用户身份时,返回resolved的Promise if (this.userIdentity) { return Promise.resolve(this.userIdentity); } // 这里是问题核心!当this.userIdentity不存在时,方法没有返回任何值 }
当用户还未完成认证、this.userIdentity为undefined时,方法执行到最后没有返回任何Promise对象,所以principal.identity()会返回undefined,调用.then()就会抛出你看到的类型错误。
修复方案
你需要在identity()方法的末尾补充逻辑,处理用户身份未初始化的场景。参考JHipster默认的Principal实现,通常这里会发起HTTP请求获取用户信息,或者返回一个明确的Promise(不管是resolved还是rejected):
identity(force?: boolean): Promise<any> { if (force === true) { this.userIdentity = undefined; } if (this.userIdentity) { return Promise.resolve(this.userIdentity); } // 补充未初始化时的返回逻辑 // 这里可以替换成实际的用户信息请求,比如调用账号服务接口 return new Promise((resolve, reject) => { // 模拟请求失败或未认证的场景,你可以替换为真实的HTTP调用 this.authenticate(null); resolve(null); }); }
如果你有对应的账号服务(比如JHipster默认的AccountService),可以改成更贴合业务的逻辑:
// 记得先注入AccountService到Principal的构造函数中 identity(force?: boolean): Promise<any> { if (force === true) { this.userIdentity = undefined; } if (this.userIdentity) { return Promise.resolve(this.userIdentity); } return this.accountService.get().then(account => { this.authenticate(account); return account; }).catch(() => { this.authenticate(null); return null; }); }
额外检查建议
- 建议在应用根组件(比如
AppComponent)的ngOnInit生命周期中调用this.principal.identity(),提前初始化用户身份,避免AuthGuard执行时身份还未加载完成。 - 检查
AuthGuard的checkLogin方法,当account为null时的跳转逻辑是否符合你的预期,确保stateStorageService.storeUrl(url)能正常保存未授权的访问地址。
内容的提问来源于stack exchange,提问作者saman93
相关产品推荐
相关产品推荐

