обещание поймать не разбирает JSON - PullRequest
0 голосов
/ 11 марта 2019

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

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

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

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

Мой Typescript состоит из двух файлов 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);
  });
}

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Поскольку ваш запрос сбой (код состояния 400), он не будет проходить через обратный вызов then, он перейдет к вызову catch, поскольку в методе 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 голос
/ 11 марта 2019

Вы можете попробовать проверить статусные сообщения в разделе .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);
  });
}
...