Angular 角度4+;订阅守卫

Angular 角度4+;订阅守卫,angular,typescript,observable,angular2-services,Angular,Typescript,Observable,Angular2 Services,我的场景使我能够在激活路由时对windows用户进行身份验证/登录。因此,我只需验证用户是否经过身份验证,如果没有,则调用服务器生成一个令牌,并期望将true返回到canActivate(),可能它没有按预期工作 一段代码: auth.guard.ts import { Observable } from 'rxjs/Observable'; import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router'

我的场景使我能够在激活路由时对windows用户进行身份验证/登录。因此,我只需验证用户是否经过身份验证,如果没有,则调用服务器生成一个令牌,并期望将true返回到canActivate(),可能它没有按预期工作

一段代码:

auth.guard.ts

import { Observable } from 'rxjs/Observable';
import { CanActivate, Router, ActivatedRouteSnapshot } from '@angular/router';
import { Injectable } from '@angular/core';
import { AuthService } from './../data/auth.service';
import { TokenService } from '../auth/token.service';
import { of } from 'rxjs/observable/of';

@Injectable()
export class AuthGuard implements CanActivate {

    constructor(
        private loginService: AuthService,
        private tokenService: TokenService,
        private router: Router) {        
    }

    canActivate(route: ActivatedRouteSnapshot): Observable<boolean> {
        const operation = route.data.operation;

        if (!this.tokenService.isAuthenticated() && !this.login()) {            
            console.log('canActive1: ', false);
            return of(false);
        }

        console.log('canActive: ', true);
        return of(true);
    }    

    login() {
        this.loginService.getToken().subscribe((user) => {
            console.log('token returned..');
            if (user && user.token) {
                this.tokenService.storeToken(user.token);
                return true;
            }
            return false;
        });
    }
}
从'rxjs/Observable'导入{Observable};
从'@angular/Router'导入{CanActivate,Router,ActivatedRouteSnapshot};
从“@angular/core”导入{Injectable};
从“/../data/auth.service”导入{AuthService};
从“../auth/token.service”导入{TokenService};
从“rxjs/observable/of”导入{of};
@可注射()
导出类AuthGuard实现了CanActivate{
建造师(
私人登录服务:AuthService,
专用令牌服务:令牌服务,
专用路由器:路由器){
}
canActivate(路由:ActivatedRouteSnapshot):可观察{
const operation=route.data.operation;
如果(!this.tokenService.isAuthenticated()&&!this.login()){
log('canActive1:',false);
归还(假);
}
log('canActive:',true);
返回(真);
}    
登录(){
this.loginService.getToken().subscribe((用户)=>{
log('返回的令牌..');
if(user&&user.token){
this.tokenService.storeToken(user.token);
返回true;
}
返回false;
});
}
}
控制台:

  • canActivate1:false
  • 已返回令牌

您没有返回
login()方法的结果。试试这个

login(): Observable<boolean> {
    return this.loginService.getToken().take(1).subscribe((user) => {
        console.log('token returned..');
        if (user && user.token) {
            this.tokenService.storeToken(user.token);
            return true;
        }
        return false;
    });
}
login():可观察{
返回此.loginService.getToken().take(1).subscribe((用户)=>{
log('返回的令牌..');
if(user&&user.token){
this.tokenService.storeToken(user.token);
返回true;
}
返回false;
});
}

这是异步的,因此控制台日志稍后会出现。除此之外,您的问题是您试图从subscribe返回数据,这是不可能的。您需要返回一个可观察的

canActivate(路由:ActivatedRouteSnapshot):可观察{
const operation=route.data.operation;
返回此.login().map(bool=>{
如果(!bool&&!this.tokenService.isAuthenticated()){
返回false;
}
返回true;
}
})
}    
登录(){
//用地图代替!
返回此.loginService.getToken().map((用户)=>{
log('返回的令牌..');
if(user&&user.token){
this.tokenService.storeToken(user.token);
返回true;
}
返回false;
});
}

首先,必须使用
login():observeHey返回login()函数的结果!答案如何,对你有帮助吗?:)使用此解决方案,在执行guard时将导致多个订阅。我认为这不是一个好的解决办法。