Обработка HttpClient Http-ошибок на уровне службы

У меня есть общая служба в моем приложении, которая обрабатывает аутентификацию, я пытаюсь абстрагировать логику своего компонента как можно дальше от HTTP-запросов, однако каждая часть документации, которую я видел, требует, чтобы я возвращал httpClient Observable, и подпишитесь на него и выполните всю логику для обработки результатов и ошибок внутри компонента.

Мой текущий сервисный код полностью сломан, но выглядит он так:

userLogin(email: String, password: String) {
    const body = { email: email, password: password };
    return this.httpClient.post('http://localhost/users/login', body).subscribe(
        this.handleResults,
        this.handleErrors
    );
}

handleResults(results: any) {
    if (results.errors) {
        console.log(results.errors);
    } else {
        return results;
    }
}

handleErrors(err: HttpErrorResponse) {
    if (err.error instanceof Error) {
        // A client-side or network error occurred. Handle it accordingly.
        console.log('A ', err.status, ' error occurred:', err.error.message);
    } else {
        // The backend returned an unsuccessful response code.
        // The response body may contain clues as to what went wrong,
        console.log('Could not connect to server.');
        console.log('Backend returned code ' + err.status + ', body was: ' + JSON.stringify(err.error));
    }
}

И в идеале в компонентном модуле у меня было бы что-то вроде функции обратного вызова, которая вызывается, когда ответ готов. Кажется, что я пытаюсь идти вразрез с шаблонами Angular, но в то же время я не могу понять, почему Angular требует обработки ошибок для общих ошибок http, выполняемых на уровне компонентов.

Поэтому я полагаю, что основной вопрос заключается в следующем: как мне обрабатывать ошибки httpClient внутри службы, а не в отдельных компонентах?


person Ecksters    schedule 02.10.2017    source источник
comment
Третьим вариантом будет обработка ошибок http через перехватчик, это мой любимый подход, поскольку вы можете обрабатывать ошибки глобально и забыть о стиле. https://angular.io/guide/http#intercepting-all-requests-or-responses   -  person hayhorse    schedule 02.10.2017


Ответы (1)


Вы можете обрабатывать ошибки здесь и по-прежнему возвращать наблюдаемое, например

return this.httpClient.post('http://localhost/users/login', body).catch(this.handleErrors)
person user184994    schedule 02.10.2017