Angular 14 HTTP_INTERCEPTORS未触发问题求助
一、检查拦截器注册范围
你的拦截器在AppModule的providers数组中注册,但如果请求是从懒加载模块(比如AuthModule)发起的,需确保拦截器是在根模块注册,或通过@Injectable({ providedIn: 'root' })声明为全局服务。目前你的TokenInterceptor仅用了@Injectable()未指定providedIn,但已在AppModule注册,这点本身没问题,但要确认AuthModule是否为懒加载模式——如果是,需确保该模块已导入HttpClientModule(拦截器全局生效无需重复注册,但模块必须导入HTTP模块才能发起请求)。
二、排查JwtModule与自定义拦截器的冲突
你同时使用了JwtModule和自定义TokenInterceptor,JwtModule内部会自动注册JwtInterceptor,可能存在执行顺序或逻辑覆盖问题:
- 暂时注释
JwtModule的导入,测试自定义拦截器是否触发,若能触发则说明两者存在冲突。 - 若需同时使用,可在
JwtModule配置中通过skipWhen跳过特定请求的拦截,避免与自定义逻辑重复:JwtModule.forRoot({ config: { tokenGetter: tokenGetter, allowedDomains: ["example.com"], skipWhen: (request) => request.url.includes('/api/v1/token/refresh') }, })
三、验证请求是否通过HttpClient发起
HTTP拦截器仅对Angular的HttpClient请求生效,若使用原生fetch或XMLHttpRequest发送请求,拦截器不会触发,需确保所有请求都通过HttpClient发起。
四、确认拦截器是否进入执行逻辑
在TokenInterceptor的intercept方法开头添加日志,判断拦截器是未注册还是逻辑分支未走到:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { console.log('拦截器已触发'); // 测试用日志 // 原有逻辑... }
你的拦截器当前仅在getJwtToken()返回有效值时才添加Token,但getJwtToken获取的是refresh_token(通常应取access_token),这属于逻辑错误但不会导致拦截器不触发,可通过日志快速定位问题。
五、检查AuthService的注入有效性
确保AuthService是全局可注入的,建议修改为根注入模式,避免因模块懒加载导致注入失败:
@Injectable({ providedIn: 'root' }) export class AuthService { // 原有代码... }
六、确认模块导入顺序
HttpClientModule必须在拦截器注册之前导入,你的代码中HttpClientModule已在imports前列,这点符合要求,但如果有其他影响HTTP服务的模块,需调整至HttpClientModule之后导入。
内容的提问来源于stack exchange,提问作者user18726875

