Как я могу преобразовать ошибку 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;
});
Другие вопросы по тегам