Angular 无法将服务正确注入HttpInterceptor
我用的是离子4和角7。我正在尝试拦截HTTP请求并向标头添加令牌。问题是当我尝试从Angular 无法将服务正确注入HttpInterceptor,angular,ionic-framework,Angular,Ionic Framework,我用的是离子4和角7。我正在尝试拦截HTTP请求并向标头添加令牌。问题是当我尝试从AuthService检索时,标记总是空的。我将AuthService添加到TokenInterceptor构造函数中,并注入AuthService。他们两个都不工作。我做错了什么 AuthService.ts @Injectable({ providedIn: 'root' }) export class AuthService { public token: string; public re
AuthService
检索时,标记总是空的。我将AuthService
添加到TokenInterceptor
构造函数中,并注入AuthService
。他们两个都不工作。我做错了什么
AuthService.ts
@Injectable({
providedIn: 'root'
})
export class AuthService
{
public token: string;
public refreshToken: string;
constructor
(
private http: HttpClient,
private storage: StorageService,
)
{
this.API_URL = constants.API_URL;
this.OAUTH_URL = constants.AUTH_URL;
this.storage.getTokens().then(tokens => {
this.token = tokens.access_token;
this.refreshToken = tokens.refresh_token;
});
}
}
令牌拦截服务
@Injectable()
export class TokenInterceptorService implements HttpInterceptor
{
constructor
(
private auth: AuthService,
)
{
}
setHeaders(req: HttpRequest<any>, token: string): HttpRequest<any> {
return req.clone({
setHeaders: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
}
});
}
public intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>>
{
console.log("token int", this.auth); // I CAN SEE TOKEN HERE
console.log("token int2", this.auth.token); // TOKEN IS UNDEFINED
return next.handle(this.setHeaders(req, this.auth.token));
}
}
AuthService是个坏主意。因为它是单例,所以令牌值不能同步,而Storage.getTokens是sync方法,所以您也不能确定AuthService.token在使用它之前是否已准备好。和其他,1:你不能得到新的令牌,如果它被更新;2:你不能知道用户已经注销了
所以,请在setHeaders方法中执行此操作更好。在我的资料中,类似的逻辑是:
//TokenInterceptorService
async setHeaders(url) {
let baseHeader = {/*default values*/};
if (url in sign-in, register, logout, home or other public api) {
return baseHeader;
}
let token = {};
await storage.getToken().then(tokenData => {
token = tokenData;
};
baseHeader.token = token;
return baseHeader;
}
首先,您似乎在auth服务(需要HttpClient)、HttpClient(需要拦截器)和拦截器(需要auth服务)之间存在循环依赖关系。但是,你能进一步解释一下“我可以在这里看到标记”的意思吗?我不知道如何解决循环依赖性。如果我记录this.auth
我可以看到AuthService
中的所有变量,包括token
。对不起,在setHeaders方法中做了什么?我刚刚在那里添加了伪代码,希望对您有所帮助。
providers: [
// ....
AuthService,
APIService,
{
provide: HTTP_INTERCEPTORS,
useClass: TokenInterceptorService,
multi: true,
deps: [AuthService],
},
// ....
]
//TokenInterceptorService
async setHeaders(url) {
let baseHeader = {/*default values*/};
if (url in sign-in, register, logout, home or other public api) {
return baseHeader;
}
let token = {};
await storage.getToken().then(tokenData => {
token = tokenData;
};
baseHeader.token = token;
return baseHeader;
}