Возвращает код состояния http в компоненте из сервиса — Angular 2

#angular #angular2-services

#angular #angular2-сервисы

Вопрос:

У меня возникла проблема с возвратом объекта в моем Http-сервисе в catch моему компоненту:

Вот мой код в моем сервисе:

 login(username,password){
        let headers = new Headers();
        headers.append('Content-Type','application/json');

        return this.http.post(this.configEnvironment.url()   "oauth/access_token",
            JSON.stringify(
                {
                    username: username,
                    password: password,
                    grant_type: "password",
                    client_id: "xxxx",
                    client_secret: "xxxxx"
                }
            ),
            { headers }
        )
        .map(res => res.json())
        .catch((err:Response) => {
            let details = err.json();

            return Observable.throw(details);
         });

     }
 

Вот мой код в моем компоненте:

 this.loginService.login(this.model.username,this.model.password)
            .subscribe(
                data => console.log(data),
                error => {
                    // var details = error.json();
                    console.log(error);
                },
                ()  =>  console.log("Finished")
            );
 

Это работает нормально, когда я просто возвращаю ошибку json следующим образом:

 let details = err.json();
    return Observable.throw(details);
 

Но когда я пытаюсь добавить код состояния HTTP-ответа следующим образом:

 return  { status: err.status, error: Observable.throw(details) }
 

Это дает мне ошибку:

«Аргумент типа ‘(err: Response) => {status: number; error: ErrorObservable; }’ не может быть присвоен параметру типа ‘(err: any, перехвачено: Observable) => ObservableInput’. Тип ‘{ status: number; ошибка: ErrorObservable; }’ не может быть присвоен типу ‘ObservableInput’. Тип ‘{status: number; error: ErrorObservable; }’ не может быть присвоен типу ‘ArrayLike<{}>’. Свойство ‘length’ отсутствует в типе ‘{ status: number; ошибка: ErrorObservable; }’.»

Моя цель — просто включить код ответа http в возврат catch.

Ответ №1:

попробуйте следующий код,

 .catch((err:Response) => {
            let details = {detail:err.json(),status: err.status};
            return Observable.throw(details);
 });
 

Комментарии:

1. Добро пожаловать. Просто хочу сообщить вам, что вчера вы задали один вопрос, и я ответил. Ответ был правильным, и вы сразу же удалили его. Никогда не делайте этого, поскольку это может помочь другим пользователям разобраться в проблеме и решении, если они столкнутся с такой же ситуацией.

2. Ой, извините, Чувак, и да, никогда больше этого не сделаю. Еще раз спасибо!

Ответ №2:

просто попробуйте это

 return  [{ status: err.status, error: err.json() }]
 

это должно сработать

или также вы можете просто отправить весь err объект в блок catch и во время подписки проверить код состояния, который также работает.

  return  err
 

и во время использования подписки

err.status

Комментарии:

1. его okii, рад слышать, что вы получили свой ответ, вы можете попробовать мой тоже в качестве альтернативы 🙂