Angular не распознает перехватчик.
Итак, в основном я выполнил
ng generate interceptor JwtInterceptor
и настройка настроила добавление токена в заголовок:
import { HttpErrorResponse, HttpInterceptorFn } from '@angular/common/http';
import { catchError, throwError } from 'rxjs';
export const jwtInterceptorInterceptor: HttpInterceptorFn = (req, next) => {
console.info('Interceptor invoked');
let token: string | null = localStorage.getItem("access_token");
console.info("Token from localStorage:", token);
if (token) {
const clonedRequest = req.clone({
headers: req.headers.set(
'x-auth-token',token
)
});
return next(clonedRequest).pipe(
catchError((err: any) => {
if (err instanceof HttpErrorResponse) {
if (err.status === 401) {
console.error('Unauthorized request:', err);
} else {
console.error('HTTP error:', err);
}
} else {
console.error('An error occurred:', err);
}
return throwError(() => err);
})
);
} else {
console.info("no token")
return next(req);
}
};
Затем добавил перехватчик в провайдере:
export const appConfig: ApplicationConfig = {
providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideHttpClient(
withInterceptors([jwtInterceptorInterceptor]),
),]
};
также попробовал шаблон Di в app.config.ts:
export const appConfig: ApplicationConfig = {
providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideHttpClient(withInterceptorsFromDi()), {
provide: HTTP_INTERCEPTORS,
useValue: jwtInterceptorInterceptor,
multi: true
},]
};
И я даже поместил провайдера внутрь компонента, чего делать не следует, поскольку это может вызвать двойной запуск или вызвать конфликт, как я предполагаю:
@Component({
selector: 'app-profile',
standalone: true,
imports: [ReactiveFormsModule],
templateUrl: './profile.component.html',
styleUrl: './profile.component.css',
providers: [
{
provide: HTTP_INTERCEPTORS,
useValue: jwtInterceptorInterceptor,
multi: true
}
],
})
Я попытался избавиться от всего кода перехватчика и оставить только журналы, но перехватчик все равно не затрагивается ни при каком сценарии:
Примечание
вы не ошибаетесь, если я вас правильно понял, в любом случае я решил это (прочитайте последний ответ).
app.config.ts был неправильной оболочкой, в которой следует вызывать перехваченное, вместо этого я вызвал его в bootstrapApplication() в main.ts, и это сработало:
bootstrapApplication(AppComponent, {
providers: [
provideProtractorTestingSupport(),
provideRouter(routes),
provideAnimations(),
provideHttpClient(withInterceptors([jwtInterceptorInterceptor])),
],
}).catch((err) => console.error(err));
не могли бы вы поделиться stackblitz с минимальным воспроизводимым кодом для отладки? Я думаю, вы неправильно загружаете приложение, например, смешивая автономный и модульный режимы.