aurelia-fetch-client и конфигурация
Я использую клиент Aurelia для извлечения данных из REST-сервиса. Моя проблема в том, что, хотя HttpClient импортируется только один раз в класс AuthService, я должен передавать ему объект конфигурации перед каждым запросом, иначе он возвращается к значениям по умолчанию.
Кажется, мои перехватчики не отваливаются, я должен настроить их только один раз. Но мой baseurl имеет тенденцию падать. Странно то, что у меня проблемы с изоляцией, когда baseurl перестает работать. Иногда это так, иногда нет.
Вот мой auth.service.ts
import { APP_CONSTANTS } from '../app.constants';
import { Aurelia } from 'aurelia-framework';
import { HttpClient, json } from 'aurelia-fetch-client';
import { inject } from 'aurelia-framework';
@inject(HttpClient, Aurelia)
export class AuthService {
isRequesting: boolean = false;
isAuthenticated: boolean = false;
company: any;
user: any;
token: string;
httpConfig: any;
constructor(private http: HttpClient, private app: Aurelia) {
let self = this;
this.httpConfig = config => {
config
.withBaseUrl(APP_CONSTANTS.API_URL);
}
this.http.configure(config => {
config
.withBaseUrl(APP_CONSTANTS.API_URL)
.withInterceptor({
request(request) {
self.isRequesting = true;
return request;
},
response(response) {
if(response.status === 401) {
self.logout();
}
self.isRequesting = false;
return response;
}
})
});
let token = window.localStorage.getItem('ol_token');
let companyName = window.location.pathname;
companyName = companyName.replace('/', '');
if(!companyName.length) {
this.getCompany('onlinelog')
.then(response => response.json())
.then(result => {
self.company = result.data;
})
} else {
this.getCompany(companyName)
.then(response => response.json())
.then(result => {
self.company = result.data;
});
}
if(token) {
this.token = token;
this.http.configure(config => {
config.withDefaults({
headers: {
'Authorization': token,
}
})
})
this.getUserCredentials()
.then(response => response.json())
.then(result => {
self.user = result.data;
})
this.isAuthenticated = true;
}
}
getCompany(name) {
this.http.configure(this.httpConfig);
return this.http.fetch(`company/info/${name}`);
}
loadingTest() {
let self = this;
this.http.configure(config => {
config
.withBaseUrl(APP_CONSTANTS.API_URL)
.withDefaults({
headers: {
'Authorization': this.token
}
})
});
this.http.fetch('isauthed')
.then(response => response.json())
.then(result => {
console.log(result);
})
}
getUserCredentials() {
this.http.configure(config => {
config
.withBaseUrl(APP_CONSTANTS.API_URL)
.withDefaults({
headers: {
'Authorization': this.token
}
})
});
return this.http.fetch(`isauthed`);
}
authenticate(user, password) {
let obj = {
login: user,
password: password
}
this.http.fetch(`authenticate`, {
method: 'post',
body: json(obj)
}).then(response => response.json())
.then(result => {
this.user = result.data;
this.token = result.token;
this.setToken(result.token);
window.localStorage.setItem('ol_token', result.token);
this.app.setRoot('app');
})
}
setToken(token) {
this.http.configure(config => {
config
.withBaseUrl(APP_CONSTANTS.API_URL)
.withDefaults({
headers: {
'Authorization': token
}
})
})
}
logout() {
this.http.configure(config => {
config
.withBaseUrl(APP_CONSTANTS.API_URL)
.withDefaults({
headers: {
'Authorization': null
}
})
});
this.token = '';
window.localStorage.removeItem('ol_token');
this.user = null;
this.app.setRoot('auth/auth');
}
}
Как видите, метод "authenticate" не требует перенастройки baseurl. Но если я попытаюсь вызвать метод getUserCredentials без переконфигурирования, он выдаст ошибку JSON-синтаксического анализа, поскольку попытается отправить запрос в "localhost:9000/isauthed/" вместо "localhost:4000/api/isauthed/", как это должно быть,
Любая помощь будет оценена!
Я хочу, чтобы это работало: я настраиваю HttpClient с baseUrl и перехватчиками ONCE, чтобы иметь возможность динамически редактировать конфигурацию отправляемых заголовков, основываясь на том, аутентифицирован ли пользователь или нет.