【问题标题】:Angular route guard not calling return角度路线守卫不调用返回
【发布时间】:2019-11-14 15:30:02
【问题描述】:

我有一个像这样设置的身份验证类:

export class AuthService {
  user = new Subject<string>();

  login(name: string) {
    this.user.next(name);
  }

}

我设置了一个身份验证保护来检查我的用户主题是否具有这样的值:

export class AuthGuard implements CanActivate {
  constructor(private authService: AuthService, private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {

    return this.authService.user
      .pipe(
        map(user => {
          const isAuth = !!user;
          if (isAuth) {
            return true;
          }
          return this.router.createUrlTree(['/login']);
        })
      );
  }
}

我将打印语句放在返回中,它们永远不会被调用。该页面永远不会加载,也永远不会重定向。如果我只是返回 true 或 false 它可以工作,但是通过返回我的 authService.user 似乎什么都没有发生。

【问题讨论】:

  • 你能把你的守卫的全部内容贴出来吗?
  • @RafiHenig 我用全班更新了我的问题。
  • 身份验证总是假的你为什么使用const isAuth = !!user;!!user

标签: angular angular-router-guards


【解决方案1】:

您当前代码的明显问题是,当您订阅它时,您的应用程序的任何部分都不会将任何数据推送到user subject

如何使用BehaviorSubect 以便在您订阅它时接受一个值?使用BehaviorSubect 除非您将新值推入其中,否则您将在订阅时立即接受初始值。

export class AuthService {
   user = new BehaviorSubject<string>(null);

   login(name: string) {
     this.user.next(name);
   }
}

【讨论】:

  • 我在另一个组件上订阅和读取这个值没有任何问题,因此主题被正确填充。
  • 调试的时候map得到什么?
  • 如果我在地图中添加控制台日志,它永远不会被调用。
  • 试试 BehaviorSubect,因为它包含旧值,而不是常规主题,只有在发送新值时订阅它才能获得值。
  • 我同意,试试 BehaviorSubject 或 ReplaySubject。主题只会发出新值,但如果您订阅它,它不会发出任何现有值
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2017-01-15
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多