angular - 带有消息的Angular 8拦截重定向
问题描述
下面的代码显示了一个拦截器。当状态码为 401 时,我想将用户重定向到登录屏幕并显示消息“密码或用户名无效”。我怎样才能做到这一点?
因为如果我将用户路由到登录屏幕,是否会调用“return throwError”?而且,有没有办法测试这个?
拦截器:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(request).pipe(
catchError(err => {
let errorMessage = '';
if(err instanceof HttpErrorResponse) { // server side error
switch (err.status) {
case 401: //login
errorMessage = `Username or password not found`;
this.authenticationService.logout(); // removes session data (if there are any)
this.router.navigate(['/login']);
break;
}
return throwError(errorMessage);
}
}
))
}
登录服务方法:
login(username: string, password: string): Observable<any> {
return this.http.post<User>(`https://test/login`, { username, password })
.pipe(
map(user => {
// store user details and jwt token in local storage to keep user logged in between page refreshes
localStorage.setItem('currentUser', JSON.stringify(user));
this.currentUserSubject.next(user);
this.toast.success(user.username + ' logged in');
return user;
}));
}
组件登录方法:
this.authenticationService.login(username, password)
.pipe(first())
.subscribe(
data => {
this.router.navigate([this.returnUrl]);
},
error => {
console.error("blabla" + error);
}
);
}
解决方案
return 语句可能会运行。这取决于代码是否到达它。
我建议你用一个setTimeout()
函数包围整个开关,以确保最终用户在重定向之前会看到你的消息。这也将确保您不会在重定向之前调用 return 语句。
就像是:
setTimeout(() => {
switch (err.status) {
case 401: //login
errorMessage = `Username or password not found`;
this.authenticationService.logout(); // removes session data (if there are any)
this.router.navigate(['/login']);
break;
}
}, 3000);
3000 - 这是代码继续之前的时间(以毫秒为单位)。
推荐阅读
- influxdb - 如何在 Flux (influxdb) 中转义字符串?
- python - jupyter notebook 执行 shell 脚本并忽略输出日志
- unit-testing - 如何在 Jest 中测试 Vue 道具更新
- opencv - 如何从图像中的表格中提取文本并将它们排列到电子表格 OpenCV 中
- flutter - 如何在颤动中使用剪辑路径小部件创建具有形状的自定义按钮
- python - 如何使用 Python 访问 api.hypixel.net
- c - 这意味着什么?#define SOMENAME ((uint32_t *)0x130010f0
- javascript - 使用 CreateJS 缩放 Movieclip 子元素
- python - 使用python比较两个性能良好的xml文件
- c++ - 在 ZMQ REQ/REP 模式中回复时间过长时应用程序崩溃