Angular 17路由使用AuthGuard遇inject未定义错误求助
问题描述
我正在按Angular官方文档开发Guest Guard,逻辑是检查用户是否存在:用户存在就跳去仪表盘,不存在就进入登录页。写出的代码如下:
import { CanActivateFn } from '@angular/router'; import { Injectable } from '@angular/core'; @Injectable() class PermissionsService { canActivate(): boolean { return false; } } export const guestGuard: CanActivateFn = (route, state) => { return inject(PermissionsService).canActivate(); };
但运行时出现报错:
[ERROR] TS2304: Cannot find name 'inject'. [plugin angular-compiler] src/app/guards/guest.guard.ts:15:13: 15 │ return inject(PermissionsService).canActivate();
解决方案
这个报错是因为你没导入Angular的inject函数——它是Angular专门用来在函数式依赖注入场景下获取服务的工具,必须从@angular/core里导入。
修改后的代码:
import { CanActivateFn } from '@angular/router'; import { Injectable, inject } from '@angular/core'; // 补上inject的导入 @Injectable({ providedIn: 'root' }) // 建议加上这个配置,让服务能被Angular正确识别注入 class PermissionsService { canActivate(): boolean { // 这里要替换成实际的用户存在检查逻辑,比如从Auth服务取用户信息判断 return false; } } export const guestGuard: CanActivateFn = (route, state) => { return inject(PermissionsService).canActivate(); };
额外提醒两点:
- 你的
PermissionsService必须配置providedIn或者在模块的providers数组里声明,不然Angular找不到这个服务,加{ providedIn: 'root' }是最简单的方式,让服务成为根级单例。 - 现在
canActivate里返回的是固定false,得改成符合你业务的逻辑,比如判断当前是否有登录用户,返回true或false,或者返回路由跳转的Observable/Promise(比如用户存在时跳去仪表盘)。
内容的提问来源于stack exchange,提问作者Alaksandar Jesus Gene
相关产品推荐
相关产品推荐

