我有一个SessionService
,它管理JWT令牌并存储用户数据。启动我的应用程序后,我需要通过http从后端获取用户数据。这可能不是一个好主意,但是由于没有ngOnInit()
用于服务,因此我在SessionService
构造函数中这样做:
@Injectable({
providedIn: 'root'
})
export class SessionService {
constructor(
private errHandler: ErrorHandlingService,
private backend: UsersService
) {
const initialToken = this.rawToken; // localStorage.getItem('jwt')
if (!initialToken || this.isTokenExpired(initialToken)) {
localStorage.removeItem('jwt');
return;
}
this.fetchUser();
}
private fetchUser() {
this.backend.getMe().subscribe(
user => this.user = user,
err => this.errHandler.handle(err)
);
}
/* ... */
}
我认为这非常简单,UsersSevice::getMe()
只是以下内容的抽象:
getMe() {
return this.http.get<Api.V1.Me.Get.Response>('/api/v1/me');
}
问题是我的HttpInterceptor
将JWT附加到每个http请求的标头,并且它是通过我的SessionService
获得的,因此此服务的名称为undefined
,因此{{1} }在访问其TypeError
吸气剂(rawRoken
)时引发
can not read property rawToken of undefined
我找到了一种解决方法,可以将@Injectable()
export class JwtInterceptor implements HttpInterceptor {
constructor(private session: SessionService) {}
intercept(req: HttpRequest<unknown>, next: HttpHandler) {
const rawToken = this.session.rawToken;
/* ... */
}
}
的调用包装为this.fetchUser()
,但是为什么必须将其推迟到另一轮事件循环中呢?那是我的问题。请告诉我,我违反了什么规则?