Как я могу преобразовать ошибку Http до ее обработки с помощью subscribe()?
У меня есть компонент angular2, который использует сервис, который использует Http
сделать HTTP-запрос.
Сервис выглядит примерно так:
export class AuthenticateService {
constructor(private http: Http) {}
public authenticateUser(username: string, password: string) : Observable<User> {
return this.http.post("http://localhost:3002/admin/login", {
username: username, password: password
})
.map((res: Response) => {
//I can fiddle with non-error responses here, but if an error happens then this doesnt get called
return res.json() as User;
});
}
И компонент выглядит примерно так:
export class LoginFormComponent {
userRequest : Observable<User>;
constructor(private _authenticateService: AuthenticateService, private _router: Router) {}
doLogin() : void {
this.userRequest = this._authenticateService.authenticateUser(this.form.username, this.form.password);
this.userRequest.subscribe(user => {
this._router.navigateByUrl("/user");
}, error => {
//this is where I just want the 'errorMessage' property, not the entire ResponseBody object
console.log("Error object looks like: ", error);
this.errorMessage = error.json().errorMessage;
});
}
}
Служба возвращает Observable, на который подписывается компонент. Тем не менее, когда error
функция выполнена (из-за HTTP-запроса, возвращающего код состояния не-200), я получаю полный объект ответа HTTP, переданный как error
параметр функции обработки ошибок.
Как я могу преобразовать его на уровне обслуживания, чтобы просто вернуть errorMessage
часть? Все, с чем я хочу иметь дело в своей функции обработки ошибок, это сообщение об ошибке строки, оно не должно иметь дело со всем объектом ответа HTTP или даже знать, что HTTP - это вещь.
Я привык к Обещаниям и все еще пытаюсь разобраться с RxJS.
1 ответ
Вы можете использовать catch()
оператор:
this.userRequest
.catch(e => Observable.throw(e.json().errorMessage))
// or just .catch(e => throw e.json().errorMessage)
.subscribe(user => {
this._router.navigateByUrl("/user");
}, error => {
//this is where I just want the 'errorMessage' property, not the entire ResponseBody object
console.log("Error object looks like: ", error);
this.errorMessage = error;
});