【发布时间】:2018-05-06 22:16:15
【问题描述】:
我想在文件auth.service.ts 中编写一个函数loggedIn() 来检查本地存储中的令牌,然后在服务器端使用firebase/php-jwt 进行验证。但是 Typescript 中的代码给出了一个无限循环。这是我的代码:
auth.service.ts
loggedIn(){
const token: string = localStorage.getItem('id_token');
if (token == null) {
return false;
}
else {
const subs = this.http.post('http://localhost/url/to/myPHP.php', {"token":token})
.map(res=>res.json()).subscribe(data=>{
if(data.valid){
this.valid = true;
} else {
this.valid = false;
}
},
err=>console.log(err));
if (this.valid){
console.log("Valid");
return true;
} else {
console.log("Invalid");
return false;
}
}
}
给定令牌:有效令牌。
结果:没有给出错误,但有无限的“有效”console.log 并返回 true,直到 Apache 宕机。
给定令牌:无效令牌
结果:没有错误但无限的 console.log 'Invalid' 并返回 false,直到 Apache 宕机。
我尝试过的:
loggedIn(){
const token: string = localStorage.getItem('id_token');
if (token == null) {
return false;
}
else {
const subs = this.http.post('http://localhost/url/to/myPHP.php', {"token":token})
.map(res=>res.json()).subscribe(data=>{
if(data.valid){
this.valid = true;
} else {
this.valid = false;
}
},
err=>console.log(err));
if (this.valid){
console.log("Valid");
console.log(this.valid);
return true;
} else {
console.log("Invalid");
console.log(this.valid);
return false;
}
subs.unsubscribe();
return true;
}
}
subs.unsubscribe(); 行确实停止了循环,但它实际上会取消订阅Observable<Response>,并且.subscribe() 中的代码将不会运行。请帮忙。
编辑:loggedIn()的用法
*ngIf="authService.loggedIn()
在导航栏组件中 4 次。
内部auth.guard.ts
canActivate(){
if (this.authService.validToken){
return true;
} else {
this.router.navigate(['/login']);
return false;
}
}
在app.module.ts {path:'profile', component:ProfileComponent, canActivate:[AuthGuard]}
【问题讨论】:
-
您是否跟踪过您的
loggedIn()方法被调用了多少次?您是否在模板中使用过ngIf="loggedIn()"之类的东西,每次报价都会被评估? -
是的,我 dd,它被调用了 5 次。包括'ngIf'
-
在您的
ngOnInit()中调用一次,设置一个局部变量,然后引用该变量而不是模板中的方法。 -
取决于您的应用程序的其余部分是什么样的。不过应该很容易追踪。
-
@RobbyCornelissen 谢谢你的建议,我试试看。
标签: http post token jwt angular5