【发布时间】:2018-06-10 10:01:45
【问题描述】:
CatchError 在 401 响应中被完全忽略。
我有处理 oauth2 身份验证的 httpInterceptor。
相关代码为:
import { filter, take, switchMap, map, catchError } from 'rxjs/operators';
//ommited
if (authService.hasRefreshToken()) {
return authService.doRefreshToken().pipe(switchMap(tokenResponse => {
const accessToken = tokenResponse['access_token'];
this.tokenSubject.next(accessToken);
return <Observable<HttpEvent<any>>> next.handle(this.addToken(req, accessToken));
}), catchError((err: any, caught: any) => {
console.log(err)
return Observable.throw(err);
})
)
}
AuthService 类:
export class AuthService {
doRefreshToken() {
//ommited
return this.httpClient.post(environment.baseUrl + this.tokenEndpoint, null, requestOptions).pipe(
map(tokenResponse => {
this.saveToken(tokenResponse);
return tokenResponse;
}),
catchError((err: any, caught: Observable<Object>) => {
//refreshing token failed (refrech token invalid or expired) redirect to login and wipe everything
this.logout();
return Observable.throw(err);
}));
}
}
对于 200 响应一切正常,但完全忽略 401 错误。 我是否以错误的方式使用了这个新的 catchError ?
附:这段代码在普通的旧 catch 上运行得很好,但是现在当我迁移到 angular6 管道和 catchError 时,同样的东西就不起作用了。
编辑:
catchError 上的断点显示
"SyntaxError: 输入意外结束 在 AuthService.push../src/app/common/auth/auth.service.ts.AuthService.doRefreshToken
服务器的实际响应是:
{
"error" : "invalid_token",
"error_description" : "Refresh token expired"
}
标题:
Request Method: POST
Status Code: 401
【问题讨论】:
-
doRefreshToken() 效果好吗?
-
doRefreshToken() 中 catchError 上的断点显示消息处输入意外结束。这个方法在response为200且token更新成功的情况下确实很好用。
-
@SeaBiscuit 你有没有找到解决方案?我遇到了同样的问题,400 响应没有进入 catchError...
-
并非如此。在我升级到 Angular 6 后它刚刚停止工作。幸运的是,我们仍在开发中,所以我将这个问题推到了积压的末尾,并希望有人能在这里发布一些东西 :)