promise catch не анализирует json

#javascript #json #angular #angular-http

#javascript #json #угловой #angular-http

Вопрос:

Я использую Angular Http для отправки в свой API, когда статус ответа равен 200, он анализирует его должным образом и выводит только мой ответ, как ожидалось, я обрабатываю это в рамках первого .then() обещания, но когда в моем API появляется ошибка, я выдаю его со статусом 400 и пытаюсь обработать его через .catch() блок.

Проблема, с которой я сталкиваюсь, заключается в том, что у .catch() есть не только моя ошибка raw json из моего api, она просто не определена. Мой ответ об ошибке от моего API выглядит примерно так:

 {
    "status": 400,
    "message": "Bad request",
    "errors": [
        {
            "code": "IN_USE",
            "message": "Email is in use",
            "field": "email"
        }
    ],
    "data": []
}
  

Я убедился, что отправляю application/json заголовки как с ответом 200, так и с ответом 400, поэтому я не уверен, почему мой код typescript не будет анализировать json на .catch()

Мой машинописный текст состоит из двух файлов, api и user пользователь просто расширяет api, чтобы использовать post() созданный мной метод:

api.ts

 /**
  * POST to the API
  * @param path    Where to go
  * @param params  What to send
*/
public post(path, params): Promise<any> {
  return this.http
    .post(this.apiUrl   path, params)
    .toPromise()
    .then(r => r.json());
}
  

user.ts

 /**
  * Registers a user and then logs them in via token
  * @param name Users name
  * @param email Users email
  * @param password Users password
*/
register(name: string, email: string, password: string) {
  this.post('/register', {
    access_token: this.accessToken,
    name: name,
    email: email,
    password: password
  })
  .then(r => {
    // This logs the json just fine
    console.log(r);
  })
  .catch(r => {
    // This is undefined
    console.log(r);
  });
}
  

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

1. В чем ошибка? r Действительно ли ссылается на объект, который имеет .json функцию?

2. для меня ответ выглядит правильным; это допустимый JSON.

3. @Ouroborus Мой API всегда возвращает JSON, просто статус равен 200 или 400. Я перевожу его в json в моем классе API .then(r => r.json()) . Когда статус равен 400, он не выдает мне json, просто undefined но когда статус ответа api равен 200, он отлично разбирается в json.

4. Если ваш код состояния равен 400 (или любой другой код ошибки), то обещание в вашем методе post не анализируется, потому что .then(r => r.json()); часть никогда не достигается.

Ответ №1:

Поскольку ваш запрос не выполняется (код состояния 400), он не пройдет через then обратный вызов, он перейдет к catch one, поскольку у вас его нет в post методе, он перейдет к register методу catch, поскольку вы не выполняли синтаксический анализ в json, это не будет json.

Попробуйте это:

 public post(path, params): Promise<any> {
  return this.http
    .post(this.apiUrl   path, params)
    .toPromise()
    .then(r => r.json())
    .catch(e => throw new Error(e.json()));
}
  

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

1. TypeError: undefined is not an object (evaluating 'r.errors[0]')

Ответ №2:

Вы можете попробовать проверить наличие сообщений о состоянии в .then(r => ) разделе, а затем в соответствии со статусом вы можете продолжить свою логику.

 register(name: string, email: string, password: string) {
  this.post('/register', {
    access_token: this.accessToken,
    name: name,
    email: email,
    password: password
  })
  .then(r => {
    // This logs the json just fine
   if(r.status == 200){
     console.log(r);
   }
   if(r.status == 400){
     console.log(r);   
    }


  })
  .catch(r => {
    // This is undefined
    console.log(r);
  });
}