2017-04-25 51 views
0

我試圖做一個404 authguard檢查。如果該數據庫中不存在該ID,則將被重定向到404路由。角度authguard firebase id檢查

但由於某種原因,快照中的條件從不加載,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; 
    }); 
    }); 
} 
+0

您是否試過在'map'函數內寫入'return this.af.database.list'? – echonax

+0

已經嘗試過,但如果不起作用並且總是返回false。 – Jorge

+0

已更新線程與我目前的問題... – Jorge

回答

0

找到了解決辦法,我用的是this.route(有2路),而不是僅僅accesing參數來獲得鑰匙。 此外,我使用的是訂閱而不是地圖(儘管我並不真正瞭解地圖和訂閱在這種情況下的區別),但出於某種原因訪問訂閱和返回真正的捕捉沒有奏效。

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(); 
} 
0

你不能params使用map()params不是數組,也可觀察到的,而是一個對象。您可以使用map()ActivatedRoute,因爲它會返回一個Observable,但快照將返回固定值,而不是流。此外,請注意,您正在使用this.route而不是route。如果不是拋出一個錯誤,那麼你可能在守衛中有另一個route

也許你可以有你需要的ParamMap。如果你知道鑰匙,你可以使用route.paramMap.get('yourkey')。如果你想在迭代請求的所有參數,可以你可以用它們作爲數組:

route.paramMap.keys.map(key => { ... });