我有一个应用程序,其中有两个警卫(AuthGuard - 用于登录用户,AdminGuard - 用于管理员)。首次加载时 AuthGuard 会发出 http 请求以从 API 获取用户信息。问题是,当您尝试使用两个防护访问路由时,AdminGuard 不会等待 AuthGuard 完成请求并设置用户,以便 AdminGuard 可以检查用户的角色,并且应用程序会中断。我知道它会崩溃,因为用户未定义。我正在寻找如何让第二个守卫等待第一个守卫完成的解决方案。
{
path: 'admin',
component: AdminComponent,
canActivate: [AuthGuard, AdminGuard]
},
@Injectable()
export class AuthGuard implements CanActivate {
constructor(
private authService: AuthService,
private http: HttpClient) { }
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return this.http.get('https://jsonplaceholder.typicode.com/users').map(res => {
console.log('Auth Guard.');
console.log(res);
this.authService.user = {role: 'admin'};
return true;
});
return false;
}
}
@Injectable()
export class AdminGuard implements CanActivate {
constructor(private authService: AuthService) …Run Code Online (Sandbox Code Playgroud) 如何在使用管道和映射时返回值,就像在这个场景中一样:
\n\nreturn this.service.someEvent().pipe(\n map(x => {\n return this.service.someValue;\n })\n)\nRun Code Online (Sandbox Code Playgroud)\n\n但该值永远不会返回,因为从未订阅该事件,如果我像这样使用它:
\n\nconst a = this.service.someEvent().pipe(\n map(x => {\n return this.service.someValue;\n })\n)\n\nreturn a.subscribe();\nRun Code Online (Sandbox Code Playgroud)\n\n我收到错误(我知道这是错误的)。
\n\nTS2322: Type\xc2\xa0'Subscription'\xc2\xa0is\xc2\xa0not\xc2\xa0assignable\xc2\xa0to\xc2\xa0type\xc2\xa0'boolean\xc2\xa0|\xc2\xa0Observable<boolean>\xc2\xa0|\xc2\xa0Promise<boolean>'. \xc2\xa0\xc2\xa0Type\xc2\xa0'Subscription'\xc2\xa0is\xc2\xa0not\xc2\xa0assignable\xc2\xa0to\xc2\xa0type\xc2\xa0'Promise<boolean>'. \xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Property\xc2\xa0'then'\xc2\xa0is\xc2\xa0missing\xc2\xa0in\xc2\xa0type\xc2\xa0'Subscription'.\nRun Code Online (Sandbox Code Playgroud)\n\n所以我需要我的方法来返回值。
\n\n更新:\n更好的描述(我需要使用最新版本的 rxjs 复制此代码):
\n\ncanActivate(next: ActivatedRouteSnapshot,\n state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {\n return this.service.something().map(x => {\n if (x) {\n return true;\n } else {\n return false;\n }\n })\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n\n需要用管道内的地图来完成(据我所知)。
\n