承诺捕获不会解析json

时间:2019-03-11 20:21:04

标签: javascript json angular angular-http

我正在使用Angular Http发布到我的API,当响应的状态为200时,它将正确解析它并仅输出期望的响应,我将在第一个.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标头的响应分别为200和400,所以我不确定为什么我的打字稿代码不会解析.catch()上的json

我的打字稿由两个文件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);
  });
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

由于请求失败(状态码为400),因此不会通过then回调传递,它将转到catch,因为{中没有任何回调{1}}方法将冒泡到post方法捕获,因为您没有解析为json,因此它不会是json。

尝试一下:

register