You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nx应用从14升级到16后路由失效,报NG0203注入上下文错误

Nx 14升级到16后路由NG0203错误解决方法

NG0203错误核心原因是Angular 16(Nx 16对应Angular 16)严格限制了inject()的调用上下文,仅允许在构造函数、工厂函数顶层、字段初始化器等注入上下文中调用,以下是针对性解决步骤:

  • 修正路由守卫/解析器的依赖注入方式
    若使用类守卫,禁止在canActivate/canLoad等方法内调用inject(),必须在构造函数中注入依赖:
    错误写法:

    @Injectable({ providedIn: 'root' })
    export class AuthGuard implements CanActivate {
      canActivate() {
        const authService = inject(AuthService); // 非法调用
        return authService.isLoggedIn();
      }
    }
    

    正确写法:

    @Injectable({ providedIn: 'root' })
    export class AuthGuard implements CanActivate {
      constructor(private authService: AuthService) {} // 构造函数注入
    
      canActivate() {
        return this.authService.isLoggedIn();
      }
    }
    

    若使用函数式守卫,确保inject()直接在函数顶层调用,不要嵌套在异步回调或内部函数中:

    export const authGuard: CanActivateFn = () => {
      const authService = inject(AuthService); // 顶层调用,合法
      const router = inject(Router);
    
      return authService.isLoggedIn().pipe(
        map(isLoggedIn => isLoggedIn || router.createUrlTree(['/login']))
      );
    };
    
  • 规范路由懒加载配置
    升级后需使用Angular 16兼容的懒加载写法,避免旧版语法导致的注入上下文丢失:
    旧版错误写法:

    {
      path: 'dashboard',
      loadChildren: () => import('./dashboard/dashboard.module').then(m => m.DashboardModule)
    }
    

    推荐写法(直接导入路由配置而非模块):

    {
      path: 'dashboard',
      loadChildren: () => import('./dashboard/dashboard.routes').then(m => m.DASHBOARD_ROUTES)
    }
    
  • 确保依赖版本完全兼容
    检查package.json,确保@angular/*、nx、@nrwl/*均为16.x系列版本,无跨版本混合依赖。可通过以下命令完成迁移:

    nx migrate latest --from=14.8.0 --to=16.10.0
    npm install
    nx migrate --run-migrations
    
  • 修复全局注入逻辑问题
    若在APP_INITIALIZER等全局工厂函数中使用inject(),必须在工厂函数顶层调用,禁止嵌套在返回的回调函数内:
    错误写法:

    providers: [
      {
        provide: APP_INITIALIZER,
        useFactory: () => {
          return () => {
            const configService = inject(ConfigService); // 非法嵌套调用
            return configService.loadConfig();
          };
        },
        multi: true
      }
    ]
    

    正确写法:

    providers: [
      {
        provide: APP_INITIALIZER,
        useFactory: () => {
          const configService = inject(ConfigService); // 顶层调用
          return () => configService.loadConfig();
        },
        multi: true
      }
    ]
    

内容的提问来源于stack exchange,提问作者sunil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:22:32