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
