router.navigate 现在正在与 guard 合作

router.navigate is now working with guard

我正在用 angular 9 和 asp.net core 3.1 制作 wep ap。

我做了一个守卫来保护 url ("/perfil")。它使用服务获取 cookie,如果 cookie 存在则重定向到(“/perfil”),如果不存在则重定向到(“/pre-register”)。

我已经尝试过,当 cookie 不存在时工作正常,因为重定向到(“/pre-register”),但是当 cookie 存在时不要重定向到 url(“/perfil”) .

我用后端代码测试了 cookie,这个工作正常。

可以激活码:

      canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {

    var validation = false;

    this.userService.cookieValidation().subscribe((data: any) => {
      if (data == 1) {
        validation = true;
      }
      else {
        this.router.navigate(["/pre-register"]);
      }
    });

    return validation;
}

重定向代码

this.userService.userRegisterEmail(this.formLogin.value).subscribe((data: any) => {

      console.log(data);

      if (data == 2) {
        this.submitEmailRepeat = true;
        this.touchedEmailRepeat = true;
      }

      if (data == 0) {
        this.router.navigate(["/error"]);
      }

      if (data == 1) {
        this.router.navigate(["/perfil"]);

      }

    });

问题在这里:

this.userService.cookieValidation().subscribe((data: any) => {
      if (data == 1) {
        validation = true;
      }
      else {
        this.router.navigate(["/pre-register"]);
      }
    });

这是异步的。这意味着它不会按照您编写的顺序发生,而是放在 'hold.'

因此,您的代码中实际发生的事情是您将其搁置,然后 returning validation 等于 false。所以你总是 returning false,不管你的订阅里面发生了什么。事实上,你 returning false 并且它 re-routes 到你想要的地方 re-route 的事实只告诉我你在你的路由器中有一个默认路由 pre-register

一个解决方案是直接return Observable,

return this.userService.cookieValidation().pipe(
    map((data: any) => {
      if (data == 1) {
        return true;
      }
      else {
        this.router.navigate(["/pre-register"]);
        return false;
      }
    }));

请注意,您没有订阅它,而是直接 return 对其进行映射(并对其进行映射,以便将您获得的任何内容转换为布尔值,请参阅 rxjs 的映射运算符以获取更多信息)。我不确定 return 这个 observable 是否有效,但我相信它应该。