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 ცვლადში
