promise catch 不解析 json

promise catch does not parse json

我正在使用 Angular Http 到 post 到我的 API,当响应的状态为 200 时,它会正确解析它并只输出我的响应正如预期的那样,我使用 promise 中的第一个 .then() 来处理这个问题,但是当我的 API 出现错误时,我将其抛出状态为 400 并尝试通过 .catch() 块来处理它。

我遇到的问题是 .catch() 不只是来自 api 的原始 json 错误,它只是未定义。我的 API 的错误响应类似于:

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

我已确保发送 application/json headers 时同时包含 200 和 400 响应,所以我不确定为什么我的打字稿代码不会解析 json在 .catch()

我的 Typescript 由两个文件 apiuser 组成,用户只是扩展 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);
  });
}

您可以尝试在 .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);
  });
}

由于您的请求失败(400 状态代码),它不会通过 then 回调,它将转到 catch 回调,因为您没有post 方法它将冒泡到 register 方法捕获,因为您没有解析为 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()));
}