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

Angular中router.navigate调用失败:TypeError报错求助

问题解决:TypeError: router1.navigate is not a function

问题原因

错误提示明确说明传入logout函数的router1不是有效的Angular Router实例。虽然你在类的构造函数中已经注入了Router,调用logout时也传入了this.router,但这种额外传参的写法完全冗余,还可能因实例未正确初始化、意外覆盖等情况引发错误。

解决方案

方案1:移除冗余参数,直接使用类内注入的Router实例

修改logout函数,去掉router1参数,直接调用构造函数中注入的this.router:

constructor(
    private router: Router,
) {}

logout() {
  this.refreshTokenInProgress = false;
  PreAngular.clearAll();
  localStorage.clear();
  if (window.location.href.indexOf("/public/login") === -1) {
    this.router.navigate(["/public/login"]);
  }
}

同时修改sendRequest中的调用方式:

sendRequest(
    request: HttpRequest<any>,
    next: HttpHandler,
    isCacheable: Boolean,
) {
    return next.handle(request).pipe(
      catchError((error) => {
        if (error.status === 401 || (error.error != null && error.error.code == "0101")) {
          this.logout(); // 不再传递router参数
          return throwError(error);
        }
      }),
    );
}

方案2:优化路由判断逻辑(可选)

用Angular Router自身API判断当前路由,比直接操作window.location.href更可靠,避免路径匹配的潜在问题:

// 先在构造函数中注入ActivatedRoute
constructor(
    private router: Router,
    private activatedRoute: ActivatedRoute
) {}

logout() {
  this.refreshTokenInProgress = false;
  PreAngular.clearAll();
  localStorage.clear();
  // 用router.url获取当前路由路径
  if (!this.router.url.includes("/public/login")) {
    this.router.navigate(["/public/login"]);
  }
}

额外检查点

确保你的模块中已正确导入RouterModule.forRoot(...),且当前服务(假设是HTTP拦截器)的Provider配置正确,不存在错误的实例覆盖逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:25:28