javascript - Angular ადმინისტრატორის დაცვის პრობლემა ტიპის 'void' გამოსახულება არ შეიძლება შეამოწმონ სიმართლეზე


მე მაქვს

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

}

ჩემი ავტორიზაციის მომსახურებაში. მინდა წავიკითხო ბინიერული მნიშვნელობა ბაზიდან და ადმინისტრატორის მცველი დავაყენო სიმართლე.

მე ვიძახებ ფუნქციას 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 ცვლადში