【发布时间】:2021-10-18 07:20:39
【问题描述】:
我的请求有问题。
这个想法是,如果请求失败,因为令牌过期函数将发送登录请求(带有来自会话数据的数据),并将再次发送原始请求并返回值。
我认为这可能有明显的解决方案,但我几乎没有用 js 编写代码。
知道如何解决吗?
代码在这里:
apiCall(url, body, first = true) {
const httpOptions = {
headers: new HttpHeaders()
.set('Authorization', `Bearer ${sessionStorage.getItem('jwt')} `),
};
this.deleteNullParams(body);
return this.httpClient.post(this.API_URL + url, body, httpOptions).pipe(
map(response => {
if (response['result'] != 'success' && first) {
console.log("Failed");
this.loginWithSessionData();
return this.apiCall(url, body, false);
}
else {
return response;
}
})
);
}
getLocationDetails(body) {
return this.apiCall('/api/locationList', body);
}
loginWithSessionData() {
let password = sessionStorage.getItem('password');
let username = sessionStorage.getItem('username');
if (password && password != '' && username && username != '') {
const json = {};
json['username'] = username;
json['password'] = password;
this.userLogin(json).subscribe((res: any) => {
if (res['body']['result'] !== 'failed') {
sessionStorage.setItem('jwt', res.body['data'].token);
localStorage.setItem('login_data', JSON.stringify(res.body['data']));
return true;
}
}, (error) => { });
}
else {
sessionStorage.clear();
}
return false;
}
所以我想在获得有效令牌后再次返回 apiCall,但由于某种原因,除了登录之外的任何其他请求都不会在 apiCall 函数中发送。
编辑:
更具体地说,调用函数时会发生什么:
尝试获取数据,
由于没有(或过期)令牌而失败,
发送登录请求,获取它,
设置令牌,就是这样,
在下一个刷新/更改页面之前,不会再发送任何请求。
回答
好的,所以接受的答案是正确的,只需要添加返回:
apiCall(url, body, first = true) {
const httpOptions = {
headers: new HttpHeaders()
.set('Authorization', `Bearer ${sessionStorage.getItem('jwt')}`)
};
this.deleteNullParams(body);
return this.httpClient.post(this.API_URL + url, body, httpOptions).pipe(
switchMap((response: any) => {
return iif(
() => response['result'] != 'success' && first,
this.loginWithSessionDataObs().pipe(switchMap(() => this.apiCall(url, body, false))),
of(response)
)
})
);
}
【问题讨论】:
-
问题是,您尝试在
this.loginWithSessionData();甚至有机会登录之前运行this.apiCall(url, body, false);- 您需要等待登录完成,然后再尝试调用 api再次 -
我是这么想的,但即使我设置了 80 apiCall 仍然只有一个请求可见,为什么?
-
我不知道,这是个谜
标签: javascript angular typescript request