我尝试检查当前用户是否存在(登录)并在auth guard中返回。
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
firebase.auth().onAuthStateChanged((user: firebase.User) => {
if (user) {
return true;
}
return false;
});
}
但我收到了这个错误:
声明类型既不是'无效的函数。也没有任何'必须回来 价值。
看起来返回语句没有链接到canActivate函数。
答案 0 :(得分:1)
作为你的守护者可以激活方法,返回类型是布尔值,你不会返回任何你得到错误的东西。
您可以返回布尔值来解决此问题。但在你的情况下,我可以看到你的返回类型是可观察的,并且在observable中你想要返回true或false。
所以你改变了警惕。
你需要做以下两件事
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): : boolean | Observable<boolean> | Promise<boolean> {
return firebase.auth().onAuthStateChanged((user: firebase.User) => {
if (user) {
return true;
}
return false;
});
}
您需要检查firebase.auth().onAuthStateChanged()
的返回类型,通常这些方法返回observable。如果是这种情况,那么您需要将其更改为如下
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): : boolean | Observable<boolean> | Promise<boolean> {
return firebase.auth().onAuthStateChanged().map((user: firebase.User) => {
if (user) {
return true;
}
return false;
});
}
答案 1 :(得分:1)
canActivate
方法应返回Observable<boolean> | Promise<boolean> | boolean
您应该从onAuthStateChanged
回调中创建一个Promise或可观察的:
canActivate(next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
return new Promise((resolve, reject) => {
firebase.auth().onAuthStateChanged((user: firebase.User) => {
if (user) {
resolve(true);
} else {
this.router.navigate([ '/login' ], { queryParams: { returnUrl: state.url } });
resolve(false);
}
});
});
}