2017-02-18 41 views
1

使用Angular和AngularFire2(Firebase包),并试图使用防护来防止除一个用户以外的所有用户访问特定路由。但下面的代码将不起作用。我得到的错误:无法使用Angular2的AuthGuard中的Observable.of(true)工作

Class 'AuthGuard' incorrectly implements interface 'CanActivate'. Type 'void' is not assignable to type 'boolean | Observable | Promise'.

import { Injectable } from '@angular/core'; 
import { CanActivate } from '@angular/router'; 

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/observable/of'; 
import { AngularFire, FirebaseListObservable } from 'angularfire2'; 

@Injectable() 
export class AuthGuard implements CanActivate { 
    constructor(private af: AngularFire) { } 

    canActivate() { 
    this.af.auth.subscribe(auth => { 
     if (auth.uid === 'xyz123') { 
     return Observable.of(true); 
     } else { 
     return Observable.of(false); 
     } 
    }) 
    } 
} 
+0

你也可以返回'true'和'false'(没有'Observable') –

+0

不在订阅 – Weblurk

+0

啊,我错过了那条线。你根本不应该使用'subscribe' –

回答

2
canActivate() { 
    return this.af.auth 
    .map(auth => { 
     return auth.uid === 'xyz123'; 
    }) 
    } 

路由器需要一个booleanObservable<boolean>但如果你打电话subscribecanActivate将返回Subscription。 如果您使用map,则返回值将是Observable