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, чтобы иметь возможность динамически редактировать конфигурацию отправляемых заголовков, основываясь на том, аутентифицирован ли пользователь или нет.

0 ответов

Другие вопросы по тегам