router.navigate 现在正在与 guard 合作
router.navigate is now working with guard
我正在用 angular 9 和 asp.net core 3.1 制作 wep ap。
我做了一个守卫来保护 url ("/perfil")。它使用服务获取 cookie,如果 cookie 存在则重定向到(“/perfil”),如果不存在则重定向到(“/pre-register”)。
我已经尝试过,当 cookie 不存在时工作正常,因为重定向到(“/pre-register”),但是当 cookie 存在时不要重定向到 url(“/perfil”) .
我用后端代码测试了 cookie,这个工作正常。
可以激活码:
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
var validation = false;
this.userService.cookieValidation().subscribe((data: any) => {
if (data == 1) {
validation = true;
}
else {
this.router.navigate(["/pre-register"]);
}
});
return validation;
}
重定向代码
this.userService.userRegisterEmail(this.formLogin.value).subscribe((data: any) => {
console.log(data);
if (data == 2) {
this.submitEmailRepeat = true;
this.touchedEmailRepeat = true;
}
if (data == 0) {
this.router.navigate(["/error"]);
}
if (data == 1) {
this.router.navigate(["/perfil"]);
}
});
问题在这里:
this.userService.cookieValidation().subscribe((data: any) => {
if (data == 1) {
validation = true;
}
else {
this.router.navigate(["/pre-register"]);
}
});
这是异步的。这意味着它不会按照您编写的顺序发生,而是放在 'hold.'
上
因此,您的代码中实际发生的事情是您将其搁置,然后 returning validation
等于 false。所以你总是 returning false,不管你的订阅里面发生了什么。事实上,你 returning false 并且它 re-routes 到你想要的地方 re-route 的事实只告诉我你在你的路由器中有一个默认路由 pre-register
一个解决方案是直接return Observable,
return this.userService.cookieValidation().pipe(
map((data: any) => {
if (data == 1) {
return true;
}
else {
this.router.navigate(["/pre-register"]);
return false;
}
}));
请注意,您没有订阅它,而是直接 return 对其进行映射(并对其进行映射,以便将您获得的任何内容转换为布尔值,请参阅 rxjs 的映射运算符以获取更多信息)。我不确定 return 这个 observable 是否有效,但我相信它应该。
我正在用 angular 9 和 asp.net core 3.1 制作 wep ap。
我做了一个守卫来保护 url ("/perfil")。它使用服务获取 cookie,如果 cookie 存在则重定向到(“/perfil”),如果不存在则重定向到(“/pre-register”)。
我已经尝试过,当 cookie 不存在时工作正常,因为重定向到(“/pre-register”),但是当 cookie 存在时不要重定向到 url(“/perfil”) .
我用后端代码测试了 cookie,这个工作正常。
可以激活码:
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
var validation = false;
this.userService.cookieValidation().subscribe((data: any) => {
if (data == 1) {
validation = true;
}
else {
this.router.navigate(["/pre-register"]);
}
});
return validation;
}
重定向代码
this.userService.userRegisterEmail(this.formLogin.value).subscribe((data: any) => {
console.log(data);
if (data == 2) {
this.submitEmailRepeat = true;
this.touchedEmailRepeat = true;
}
if (data == 0) {
this.router.navigate(["/error"]);
}
if (data == 1) {
this.router.navigate(["/perfil"]);
}
});
问题在这里:
this.userService.cookieValidation().subscribe((data: any) => {
if (data == 1) {
validation = true;
}
else {
this.router.navigate(["/pre-register"]);
}
});
这是异步的。这意味着它不会按照您编写的顺序发生,而是放在 'hold.'
上因此,您的代码中实际发生的事情是您将其搁置,然后 returning validation
等于 false。所以你总是 returning false,不管你的订阅里面发生了什么。事实上,你 returning false 并且它 re-routes 到你想要的地方 re-route 的事实只告诉我你在你的路由器中有一个默认路由 pre-register
一个解决方案是直接return Observable,
return this.userService.cookieValidation().pipe(
map((data: any) => {
if (data == 1) {
return true;
}
else {
this.router.navigate(["/pre-register"]);
return false;
}
}));
请注意,您没有订阅它,而是直接 return 对其进行映射(并对其进行映射,以便将您获得的任何内容转换为布尔值,请参阅 rxjs 的映射运算符以获取更多信息)。我不确定 return 这个 observable 是否有效,但我相信它应该。