Return Angular 5 中 Guard 中订阅的布尔值
Return a boolean from subscribe in a Guard in Angular 5
我正在尝试 return 一个 true 以防订阅 return 我的数据。然后,如果错误,我希望它 return me false.
更深入一点,如果有或没有 cookie,我的订阅 return 会告诉我。如果有 cookie,我想 return 给我一个 True 并订阅另一个函数,如果订阅出错则为 False。
如果有 cookie,它必须订阅另一个 return 值的函数。所以我在另一个里面有一个订阅,如果他们两个都 return 给我一个我想要的值,它必须是 TRUE。
让我给你看我的代码:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
this.secureService.config({
controlType: (this.env.useCookiesFromSTS
? SecurityConstant.COOKIE_CONTROL_TYPE
: SecurityConstant.TOKEN_CONTROL_TYPE
),
advanceTime: this.env.securityConfig_advanceTime,
isDebug: false,
isSecure: this.env.securityConfig_isSecure,
whiteList: ['directline.botframework.com']
}, {
urlService: this.env.endpoints_urlSCC,
urlAttrUser: this.env.endpoints_urlUDS
}, this.env.appName)
.subscribe(
(cookie) => {
if(cookie){
this.secureService.getAttrUser(['ComTipoEmpleado'], [''])
.subscribe(
//Return true for the guard
(responseAttrUser) => console.log(responseAttrUser),
(error) => { console.error(error);
}
});
},
(err) => {
return false;
console.error(err);
});
}
基本上我需要控制我的浏览器是否有 cookie 以及员工是否获得授权,如果没有,则 return false。
这不起作用:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
boolean {
this.secureService.config({
controlType: (this.env.useCookiesFromSTS
? SecurityConstant.COOKIE_CONTROL_TYPE
: SecurityConstant.TOKEN_CONTROL_TYPE
),
advanceTime: this.env.securityConfig_advanceTime,
isDebug: false,
isSecure: this.env.securityConfig_isSecure,
whiteList: ['directline.botframework.com']
}, {
urlService: this.env.endpoints_urlSCC,
urlAttrUser: this.env.endpoints_urlUDS
}, this.env.appName)
**.map(
(cookie) => {
if (cookie){
return true;
} else {
return false;
}
});**
/*this.secureService.getAttrUser(['ComTipoEmpleado'], [''])
.subscribe(
(responseAttrUser) => console.log(responseAttrUser),
(error) => { console.error(error);
});*/
}
看来你对guard/resolver不是很熟悉。守卫和解析器将由路由器调用。如果你守卫 return 一个 Promise 或一个 Observable 路由器将等到它们被解决。
在你的情况下,你正在你的方法中进行异步调用,但你没有 returning promise/obversable,所以你的守卫只会 return "undefined" (是的你在通话中 return false 和 return true 但这些将在稍后执行,没有人会考虑它们)。
这是使用 await/async promise 做你想做的事情的简单方法(这也可以用 Observable 完成)
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
try {
const cookie = await this.secureService.config({
controlType: (this.env.useCookiesFromSTS
? SecurityConstant.COOKIE_CONTROL_TYPE
: SecurityConstant.TOKEN_CONTROL_TYPE
),
advanceTime: this.env.securityConfig_advanceTime,
isDebug: false,
isSecure: this.env.securityConfig_isSecure,
whiteList: ['directline.botframework.com']
}, {
urlService: this.env.endpoints_urlSCC,
urlAttrUser: this.env.endpoints_urlUDS
}, this.env.appName).toPromise();
if(cookie){
const user = await this.secureService.getAttrUser(['ComTipoEmpleado'], ['']).toPromise();
return user != null;
}else{
return false;
}
} catch(err) {
return false;
}
}
我正在尝试 return 一个 true 以防订阅 return 我的数据。然后,如果错误,我希望它 return me false.
更深入一点,如果有或没有 cookie,我的订阅 return 会告诉我。如果有 cookie,我想 return 给我一个 True 并订阅另一个函数,如果订阅出错则为 False。
如果有 cookie,它必须订阅另一个 return 值的函数。所以我在另一个里面有一个订阅,如果他们两个都 return 给我一个我想要的值,它必须是 TRUE。
让我给你看我的代码:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean {
this.secureService.config({
controlType: (this.env.useCookiesFromSTS
? SecurityConstant.COOKIE_CONTROL_TYPE
: SecurityConstant.TOKEN_CONTROL_TYPE
),
advanceTime: this.env.securityConfig_advanceTime,
isDebug: false,
isSecure: this.env.securityConfig_isSecure,
whiteList: ['directline.botframework.com']
}, {
urlService: this.env.endpoints_urlSCC,
urlAttrUser: this.env.endpoints_urlUDS
}, this.env.appName)
.subscribe(
(cookie) => {
if(cookie){
this.secureService.getAttrUser(['ComTipoEmpleado'], [''])
.subscribe(
//Return true for the guard
(responseAttrUser) => console.log(responseAttrUser),
(error) => { console.error(error);
}
});
},
(err) => {
return false;
console.error(err);
});
}
基本上我需要控制我的浏览器是否有 cookie 以及员工是否获得授权,如果没有,则 return false。
这不起作用:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):
boolean {
this.secureService.config({
controlType: (this.env.useCookiesFromSTS
? SecurityConstant.COOKIE_CONTROL_TYPE
: SecurityConstant.TOKEN_CONTROL_TYPE
),
advanceTime: this.env.securityConfig_advanceTime,
isDebug: false,
isSecure: this.env.securityConfig_isSecure,
whiteList: ['directline.botframework.com']
}, {
urlService: this.env.endpoints_urlSCC,
urlAttrUser: this.env.endpoints_urlUDS
}, this.env.appName)
**.map(
(cookie) => {
if (cookie){
return true;
} else {
return false;
}
});**
/*this.secureService.getAttrUser(['ComTipoEmpleado'], [''])
.subscribe(
(responseAttrUser) => console.log(responseAttrUser),
(error) => { console.error(error);
});*/
}
看来你对guard/resolver不是很熟悉。守卫和解析器将由路由器调用。如果你守卫 return 一个 Promise 或一个 Observable 路由器将等到它们被解决。
在你的情况下,你正在你的方法中进行异步调用,但你没有 returning promise/obversable,所以你的守卫只会 return "undefined" (是的你在通话中 return false 和 return true 但这些将在稍后执行,没有人会考虑它们)。
这是使用 await/async promise 做你想做的事情的简单方法(这也可以用 Observable 完成)
async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise<boolean> {
try {
const cookie = await this.secureService.config({
controlType: (this.env.useCookiesFromSTS
? SecurityConstant.COOKIE_CONTROL_TYPE
: SecurityConstant.TOKEN_CONTROL_TYPE
),
advanceTime: this.env.securityConfig_advanceTime,
isDebug: false,
isSecure: this.env.securityConfig_isSecure,
whiteList: ['directline.botframework.com']
}, {
urlService: this.env.endpoints_urlSCC,
urlAttrUser: this.env.endpoints_urlUDS
}, this.env.appName).toPromise();
if(cookie){
const user = await this.secureService.getAttrUser(['ComTipoEmpleado'], ['']).toPromise();
return user != null;
}else{
return false;
}
} catch(err) {
return false;
}
}