【问题标题】:Angular 9 TypeError: Cannot read property 'subscribe' of undefinedAngular 9 TypeError:无法读取未定义的属性“订阅”
【发布时间】:2020-08-01 18:38:49
【问题描述】:

我想要完成的是查看用户会话是否已经存在,如果存在则将它们登录。但我在如何正确执行此操作方面遇到问题。它最有可能与代码执行顺序有关,但我不明白如何解决这个问题。也许是异步的?

获取:

TypeError: 无法读取未定义的属性“订阅”

Sidebar.component.ts:

ngOnInit(): void {
this.authService.isLoggedIn.subscribe(res => {
  if (res){
    this.isLoggedIn = true;
  } else {
   
    this.isLoggedIn = false;
  }
});
}

auth.service.ts:

      get isLoggedIn(): Observable<boolean> {
    const authToken = this.cookieService.get('cookiehere');
    // console.log(authToken);
    if (authToken) {
      this.getUserBySession(authToken).subscribe(res => {
        console.log(res);

        return of(true);
      }, error => {
        return of(false);
      });
    }
    if (!authToken){
      console.log('No token found!');
      return of(false);
    }
  }


  getUserBySession(session) {
    return this.http.get(`${this.apiPrefix}/auth/get_user_by_session?session=${session}`, { headers: this.headers })
      .pipe(map((res: any) => {
        if (res.user) {
          this.currentUser = res.user;
          return res;
        } else {
          return res;
        }}));
      }

【问题讨论】:

    标签: angular typescript rxjs


    【解决方案1】:

    你在这里订阅了一个 observable,但你没有从 getter 返回一个 observable。您在那里的return of(true)subscribe 回调内部返回,而不是getter。您必须更改它以从 getUserBySession 函数返回原始 observable

    get isLoggedIn(): Observable<boolean> {
      const authToken = this.cookieService.get('vmkr');
      if (authToken) {
        return this.getUserBySession(authToken).pipe(
          map(() => true),
          catchError(() => of(false))
        );
      } else {
        console.log('No token found!');
        return of(false);
      }
    }
    

    虽然我认为这里的 getter 可能会导致多个订阅出现问题。

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-05
      相关资源
      最近更新 更多