-1

我在 Angular 应用中有两个非常相似的守卫。首先检查的是用户登录:

// isUser guard

export class isUser implements CanActivate {
  constructor(
    private fireAuth: AngularFireAuth,
    private router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
      return this.fireAuth.authState.pipe(
        take(1),
        map(authState => !!authState),
        tap(auth => !auth ? this.router.navigate(['/']) : true)
      )
  }
}

这一项工作正常:当用户未登录时,不允许他打开受保护的页面。

下一个守卫几乎相同,但它检查用户是否未登录

export class isGuest implements CanActivate {
  constructor(
    private fireAuth: AngularFireAuth,
    private router: Router
  ) {}

  canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
      return this.fireAuth.authState.pipe(
        take(1),
        map(authState => !!authState),
        tap(auth => auth ? this.router.navigate(['/']) : true)
      )
  }
}

唯一的区别是:!auth ? this.router.navigate(['/'])vs auth ? this.router.navigate(['/'])

但是isUser守卫工作得很好,并且isGuest总是允许用户页面。我做错了什么,为什么它不能工作?

4

1 回答 1

3

两个 observables 发出的值是相同的: !!authState,但它们不应该,因为一个应该只在用户通过身份验证时发出 true,而另一个应该只在用户未通过身份验证时发出 true。

map()tap()做不同的事情。

map()将发出的事件转换为其他事件。

tap()产生副作用并将发出的事件保持原样。

于 2019-08-11T08:10:46.943 回答