这是一个Angular 函数拦截器,用于管理应用程序使用期间可能出现的会话超时.

export const sessionExpiredInterceptor: HttpInterceptorFn = (req, next) => {
    const router: Router = inject(Router);
    return next(req)
        .pipe(
            catchError((error: HttpErrorResponse): Observable<never> => {
                if (error.status == 401 && !req.url.includes("login")) {
                    // router.navigateByUrl("/login");
                    window.location.href = '/login';
                }
                return throwError(() => error);
            })
        );
};

然而,我面临着被注释掉的第router.navigateByUrl("/login")行的问题.每当执行此行时,都会出现错误:"无法匹配任何路由.URL段:‘LOGIN’."

"登录"路由确实在应用程序中定义了.

起初,我怀疑这是一个背景问题.然而,在判断代码之后,我确认路由定义正确,并且我使用的是箭头函数,这应该会保留上下文.

推荐答案

您的代码也可以正常工作.您是否已将路由导入独立组件中,如下例所示:

Note:您可以导入RouterLink、RouterLinkActive等.您不需要导入完整的RouterModule个,但您可以.

  imports: [CommonModule, RouterModule, MytestComponent],

MytestComponent是在路由中注册的组件:

bootstrapApplication(App,{
  providers: [provideHttpClient(  withInterceptors([sessionExpiredInterceptor])),
  provideRouter([{path: "", pathMatch: "full", component: App}, {path: "test", pathMatch: "full", component: MytestComponent}])]});

这也很重要.将路由、所有进口和拦截器添加到您的应用程序中.

最后但并非最不重要的一点:

    <router-outlet></router-outlet>

router-outlet在您的html部分很重要.有了这些,你的应用程序就能正常工作了.

Angular相关问答推荐

Goto锚定在嵌套容器中,具有溢出自动

Angular - Bootstrap 5 Carbon不工作

Angular中绑定嵌入标签src属性的问题

仅在从forkJoin获得数据后订阅主题

Rxjs重置执行后的可观察延迟并重新调度Angular

如何从URL中角下载图片?

使用BLOB数据类型时,HTTPCLIENT中可能存在错误

FromEvent不工作,本机事件绑定

如何使用Angular 将图像作为二进制数据发送到我的API?

使用 primeng Apollo 主题进行实时部署时多次加载 theme.css 和 preloading.css 文件

错误:服务或构建Angular 项目时模块构建失败

使用forkJoin和mergeMap的正确方式是什么?

Angular ngSubmit 不起作用(内部按钮和导入模块)

Angular APP_INITIALIZER 中的 MSAL 身份验证

Chart.js 如何编辑标题标签 colored颜色

res.json() 不是函数

如何提高 Angular2 应用程序的加载性能?

Angular 4 设置下拉菜单中的选定选项

在 webpack 构建中包含 git commit hash 和 date

如何使用 CLI 创建特定版本的 Angular 项目?