Angular authguard firebase id 检查
Angular authguard firebase id checking
我正在尝试进行 404 authguard 检查。如果数据库中不存在该 ID,您将被重定向到 404 路由。
但由于某种原因,快照中的条件永远不会加载,authguard 会自动将您重定向到主路由。
代码如下:
canActivate(route:ActivatedRouteSnapshot){
this.route.params.map(key=>{
return this.af.database.object('heroes/'+key).first().subscribe(snap => {
if(snap){
console.log(true);
return true;
}
console.log(false);
return false;
});
});
}
你不能将map()
与params
一起使用,params
不是数组也不是Observable,而是一个对象。您可以将 map()
与 ActivatedRoute
一起使用,因为它 return 是一个 Observable,但快照将 return 固定值,而不是流。另请注意,您使用的是 this.route
而不是 route
。如果它没有抛出错误,可能你在守卫中还有另一个 route
。
也许 ParamMap
就能满足您的需求。如果您知道密钥,则可以使用 route.paramMap.get('yourkey')
获取它。如果你想遍历请求中的所有参数,你可以将它们作为数组使用:
route.paramMap.keys.map(key => { ... });
找到解决方案,我使用 this.route(有 2 条路线)而不是仅仅访问参数来获取密钥。
另外我使用的是 subscribe 而不是 map(尽管在这种情况下我不太了解 map 和 subscribe 之间的区别)但是出于某种原因,使用 subscribe 访问 snap 并返回 true 不起作用。
canActivate(route:ActivatedRouteSnapshot){
return this.af.database.object('heroes/'+route.params.key).map(snap => {
if(snap.name){
return true;
}
this.router.navigate(['404']);
return false;
}).first();
}
我正在尝试进行 404 authguard 检查。如果数据库中不存在该 ID,您将被重定向到 404 路由。
但由于某种原因,快照中的条件永远不会加载,authguard 会自动将您重定向到主路由。
代码如下:
canActivate(route:ActivatedRouteSnapshot){
this.route.params.map(key=>{
return this.af.database.object('heroes/'+key).first().subscribe(snap => {
if(snap){
console.log(true);
return true;
}
console.log(false);
return false;
});
});
}
你不能将map()
与params
一起使用,params
不是数组也不是Observable,而是一个对象。您可以将 map()
与 ActivatedRoute
一起使用,因为它 return 是一个 Observable,但快照将 return 固定值,而不是流。另请注意,您使用的是 this.route
而不是 route
。如果它没有抛出错误,可能你在守卫中还有另一个 route
。
也许 ParamMap
就能满足您的需求。如果您知道密钥,则可以使用 route.paramMap.get('yourkey')
获取它。如果你想遍历请求中的所有参数,你可以将它们作为数组使用:
route.paramMap.keys.map(key => { ... });
找到解决方案,我使用 this.route(有 2 条路线)而不是仅仅访问参数来获取密钥。 另外我使用的是 subscribe 而不是 map(尽管在这种情况下我不太了解 map 和 subscribe 之间的区别)但是出于某种原因,使用 subscribe 访问 snap 并返回 true 不起作用。
canActivate(route:ActivatedRouteSnapshot){
return this.af.database.object('heroes/'+route.params.key).map(snap => {
if(snap.name){
return true;
}
this.router.navigate(['404']);
return false;
}).first();
}