javascript - בעיית Angular Admin Guard ביטוי מהסוג 'void' לא ניתן לבדוק לאמיתוּת


יש לי

public getUser(userId: string) {
return this.http.get<{
  _id: string;
  registrationStep: number;
  userType: string;
  isAdmin: boolean;
}>(BACKEND_URL+"getUserData/" + userId);

}

בשירות האימות שלי. אני רוצה לקרוא ערך בוליאני מהמסד נתונים ולהגדיר את שומר המנהל ל-true.

אני קורא לפונקציה getIsAdmin מ-AdminGuard

getIsAdmin() {
this.getUser(this.getUserId()).subscribe(result => {
  return result.isAdmin;
});

}

וזוהי קוד שמירת המנהל שלי

    import {
  CanActivate,
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
  Router
} from "@angular/router";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs";

import { AuthService } from "./auth.service";

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

  canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
  ): boolean | Observable<boolean> | Promise<boolean> {
    const isAdmin = this.authService.getIsAdmin();
    if (!isAdmin) {
      this.router.navigate(['auth/admin']);
    }
    return isAdmin;
  }
}

אני מקבל את השגיאה ביטוי מסוג 'void' לא ניתן לבדוק את האמיתות שלו. תודה על עזרתך!

תשובה #1

כפי שאחרים מציינים, אינכם צריכים להירשם. canActivate מקבל Observable<boolean> כסוג החזרה.

אם תירשם, הפונקציה canActivate כבר תחזיר ולא תקבל את ערך המנוי חזרה.

היישום הבא אמור להספיק:

// authService
getIsAdmin(): Observable<boolean> {
    return this.getUser(this.getUserId()).pipe(
        map(user => user.isAdmin)
    );
}

ולגבי canActivate אתה רוצה לבצע הפניה מותאמת בעת קבלת false כך שתוכל:

canActivate(…): Observable<boolean> {
    const isAdmin$ = this.authService.getIsAdmin();
    return isAdmin$.pipe(
        tap(isAdmin => {
            if(!isAdmin) {
                this.router.navigate(['auth/admin']);
            }
        })
    );
}

תשובה #2

החזר אובזרבל מהמתודה "getIsAdmin", ואז הירשם אליו במתודת canActivate ולאחר מכן הקצה את הערך למשתנה isAdmin