gpt4 book ai didi

Angular2 CanActivate 守卫不工作

转载 作者:太空狗 更新时间:2023-10-29 17:46:53 27 4
gpt4 key购买 nike

我正在使用 Observable<boolean>返回 canActivate() .为测试设置了以下功能,它正确解析,组件显示。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return Observable.from([{ admin: true }]).map(x =>
{
if (x.admin) return true;
return false;
});
}

然而,实际代码的行为是我留在登录组件上,尽管控制台输出指示路由应该激活。与上面的测试唯一真正的区别是我正在调用服务 this.auth.isAdmin()而不是使用 Observable.from . this.auth.isAdmin()的结果是一个 Observable<boolean>值为真。

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
const isAdmin$ = this.auth.isAdmin();
return isAdmin$.map(x =>
{
console.log('isAdmin returned ' + x);
if (!x) {
console.log('redirectToLogin');
this.auth.redirectToLogin(state.url);
return false;
} else {
console.log('canActivate = true');
return true;
}
});
}

这是路由:

{
path: 'admin',
canActivate: [AdminGuard],
children: [
...adminRoutes
]
},

这是我的控制台输出:

isAdmin returned false
admin-guard.service.ts:27redirectToLogin
auth.service.ts:36 navigating to stored path "/admin"
auth.service.ts:21 Object {isAdmin: true, isPaid: false, $key: "xYFs8kMDpKdYKxDw4AL21FtnSWn1"}
admin-guard.service.ts:25 isAdmin returned true
admin-guard.service.ts:31 canActivate = true

如果感兴趣,这里是 isAdmin() 函数:

isAdmin(): Observable<boolean> {
if (!this.auth) return Observable.from([false]);
const uid = this.auth.uid;
return this.af.database.object(`user/${uid}`).do(x => console.log(x)).map(x => x.isAdmin);
}

最佳答案

isAdmin 函数返回的可观察对象未完成。 AngularFire2 FirebaseObjectObservable 实例未完成;它们随着基础数据的变化发出对象。

守卫返回的 Observable 必须完成。您可以通过使用 first(或 take(1))在发出第一个值时完成 observable 来确保这一点:

canActivate(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<boolean> {
const isAdmin$ = this.auth.isAdmin();
return isAdmin$.first().map(x =>
{
console.log('isAdmin returned ' + x);
if (!x) {
console.log('redirectToLogin');
this.auth.redirectToLogin(state.url);
return false;
} else {
console.log('canActivate = true');
return true;
}
});
}

在撰写本文时,返回的可观察对象必须完成。但是,Angular 现在调用 first 在返回的 observable 上,因此不再需要 observable 完成。

关于Angular2 CanActivate 守卫不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39442513/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com