Angular canActive 与 observable
Angular canActive with observable
我在守卫中使用 canActivate 方法。我在里面有一个可观察对象,它返回一个对象。这个对象有一个密码。我检查密码,如果正确,我希望 canActivate 为 return true,否则为 false。
这是代码
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const uid = route.params.userId;
const hackId = route.params.hackId;
const token = this.authService.token;
const queryParamsPassword = route.queryParams.password;
this.hacksStorageService.fetchHack(token, uid, hackId)
.subscribe(
hack => {
const hackPassword = hack[0].password;
if (queryParamsPassword === hackPassword ) {
return true
} else {
this.router.navigate(["/"]);
return false
}
},
error => {
return false;
}
)
}
我无法理解回复。每当它完成时,我都必须给出回应。从订阅中获得值后,我想 return canActivate 中的布尔值。
我得到的错误是关于 canActivate 方法(红色)
[ts]
Property 'canActivate' in type 'RoleGuard' is not assignable to the same property in base type 'CanActivate'.
Type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => void' is not assignable to type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean | Observable<boolean> | Pr...'.
Type 'void' is not assignable to type 'boolean | Observable<boolean> | Promise<boolean>'.
我以为我在 if 的每个分支中 returning,所以它应该足够了,但显然还不够。如果我return订阅了,他也投诉
有什么帮助吗?非常感谢。
您的方法必须 return 一些东西。它没有 return 任何东西。
它可以return一个布尔值。这只有在您可以同步知道 return 的值时才有可能。但是您需要异步调用才能知道结果应该是什么。所以你不能 return 一个布尔值。这就是为什么守卫也可以 return 和 Observable<boolean>
。所以,这样做:
return this.hacksStorageService.fetchHack(token, uid, hackId).pipe(
map(hack => {
const hackPassword = hack[0].password;
if (queryParamsPassword === hackPassword ) {
return true;
} else {
this.router.navigate(["/"]);
return false;
}
})
);
我在守卫中使用 canActivate 方法。我在里面有一个可观察对象,它返回一个对象。这个对象有一个密码。我检查密码,如果正确,我希望 canActivate 为 return true,否则为 false。
这是代码
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
const uid = route.params.userId;
const hackId = route.params.hackId;
const token = this.authService.token;
const queryParamsPassword = route.queryParams.password;
this.hacksStorageService.fetchHack(token, uid, hackId)
.subscribe(
hack => {
const hackPassword = hack[0].password;
if (queryParamsPassword === hackPassword ) {
return true
} else {
this.router.navigate(["/"]);
return false
}
},
error => {
return false;
}
)
}
我无法理解回复。每当它完成时,我都必须给出回应。从订阅中获得值后,我想 return canActivate 中的布尔值。
我得到的错误是关于 canActivate 方法(红色)
[ts]
Property 'canActivate' in type 'RoleGuard' is not assignable to the same property in base type 'CanActivate'.
Type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => void' is not assignable to type '(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => boolean | Observable<boolean> | Pr...'.
Type 'void' is not assignable to type 'boolean | Observable<boolean> | Promise<boolean>'.
我以为我在 if 的每个分支中 returning,所以它应该足够了,但显然还不够。如果我return订阅了,他也投诉
有什么帮助吗?非常感谢。
您的方法必须 return 一些东西。它没有 return 任何东西。
它可以return一个布尔值。这只有在您可以同步知道 return 的值时才有可能。但是您需要异步调用才能知道结果应该是什么。所以你不能 return 一个布尔值。这就是为什么守卫也可以 return 和 Observable<boolean>
。所以,这样做:
return this.hacksStorageService.fetchHack(token, uid, hackId).pipe(
map(hack => {
const hackPassword = hack[0].password;
if (queryParamsPassword === hackPassword ) {
return true;
} else {
this.router.navigate(["/"]);
return false;
}
})
);