2017-04-25 3 views
0

Ich versuche, eine 404 Authguard-Prüfung zu machen. Wenn die ID nicht in der Datenbank vorhanden ist, werden Sie auf eine 404-Route umgeleitet.Angular Authguard Firebase ID Überprüfung

Aus irgendeinem Grund wird die Bedingung innerhalb des Schnappschusses nie geladen und der Authguard leitet Sie automatisch zur Ausgangsroute um.

Hier ist der Code:

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

Haben Sie versucht, die 'return this.af.database.list' in die' map' Funktion zu schreiben? – echonax

+0

Bereits versucht, aber das if funktioniert nicht und gibt immer false zurück. – Jorge

+0

Aktualisiert den Thread mit meinem aktuellen Problem ... – Jorge

Antwort

0

die Lösung gefunden, ich war mit this.route (hatte 2 Strecken) statt nur accesing den Parameter zu erhalten der Schlüssel. Auch ich habe subscribe anstelle von map verwendet (obwohl ich den Unterschied zwischen map und subscribe in diesem Fall nicht wirklich verstehe), aber aus irgendeinem Grund den Snap mit subscribe zugreifen und True zurückgeben hat nicht funktioniert.

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

Sie nicht map() mit params verwenden können, ist params kein Array noch ein beobachtbares, sondern ein Objekt. Sie können map() mit einem ActivatedRoute verwenden, weil es ein Observable zurückgibt, aber ein Snapshot wird feste Werte zurückgeben, kein Stream. Beachten Sie auch, dass Sie this.route anstelle von route verwenden. Wenn es keinen Fehler gibt, haben Sie wahrscheinlich einen anderen route in der Wache.

Wahrscheinlich können Sie haben, was Sie brauchen mit einer ParamMap. Wenn Sie den Schlüssel kennen, können Sie ihn einfach mit route.paramMap.get('yourkey') verwenden. Wenn Sie alle params in der Anfrage wiederholen wollen, können Sie sie als Array kann mit:

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