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

Angular独立组件路由守卫配置后AuthService注入错误解决

解决Angular独立组件中路由守卫的NullInjectorError错误

问题场景

在Angular独立组件项目中配置功能型路由守卫后,出现如下错误:

main.ts:5 ERROR NullInjectorError: NullInjectorError: No provider for _AuthService!.

相关代码如下:

路由定义(app.routes.ts)

import { Routes } from '@angular/router';
import { domainGuard } from './guard-routes.service';
import { NotFoundComponent } from './notFound/not-found.component';
export const routes: Routes = [
  {
    path: '',
    loadComponent: () =>
      import('./home/home.component').then((m) => m.HomeComponent),
  },
  {
    path: 'users',
    loadComponent: () =>
      import('./user/user.component').then((m) => m.UserComponent),
  },
  {
    path: 'profile',
    loadComponent: () =>
      import('./profile/profile.component').then((m) => m.ProfileComponent),
  },
  { path: '**', component: NotFoundComponent },
].map((page: any) => {
  page.canActivate = [domainGuard];
  return page;
});

功能型路由守卫(guard-routes.service.ts)

import { Router } from '@angular/router';
import { AuthService } from './auth.service';
import { inject } from '@angular/core';

export const domainGuard = () => {
  const router = inject(Router);
  const service = inject(AuthService);
  if (service.IsAuth()) {
    router.navigate(['/user']);
    return true;
  } else {
    router.navigate(['/profile']);
    return false;
  }
};

AuthService(auth.service.ts)

import { Injectable } from '@angular/core';

@Injectable()
export class AuthService {
  isLoggedIn = false;

  login() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        this.isLoggedIn = true;
      }, 3000);
    });
  }

  logOut() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        this.isLoggedIn = false;
      }, 3000);
    });
  }

  IsAuth() {
    return this.isLoggedIn;
  }
}

App配置(app.config.ts)

import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';

export const appConfig: ApplicationConfig = {
  providers: [provideRouter(routes)],
};

解决方案

错误核心原因是AuthService未被注册到Angular依赖注入系统中。在独立组件应用模式下,没有NgModule来声明服务提供者,必须通过以下两种方式之一完成注册:

方式一:使用providedIn: 'root'(推荐)

修改AuthService的@Injectable装饰器,添加providedIn: 'root'元数据,让Angular自动将服务注册为根级全局提供者:

import { Injectable } from '@angular/core';

@Injectable({ providedIn: 'root' }) // 新增根级提供者配置
export class AuthService {
  isLoggedIn = false;

  login() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        this.isLoggedIn = true;
      }, 3000);
    });
  }

  logOut() {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        this.isLoggedIn = false;
      }, 3000);
    });
  }

  IsAuth() {
    return this.isLoggedIn;
  }
}

方式二:在appConfig中手动注册提供者

如果不需要全局根级服务,可以在appConfig的providers数组中直接添加AuthService:

import { ApplicationConfig } from '@angular/core';
import { provideRouter } from '@angular/router';
import { routes } from './app.routes';
import { AuthService } from './auth.service'; // 导入服务

export const appConfig: ApplicationConfig = {
  providers: [provideRouter(routes), AuthService], // 手动注册服务
};

原理说明

Angular独立组件模式下,依赖注入系统不再依赖NgModule的providers数组,服务必须显式声明提供者范围(通过providedIn)或直接在ApplicationConfig中注册,否则Angular无法找到服务实例,进而抛出NullInjectorError。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 20:33:38