Whatwg Fetch fails when json parsing an empty response, how can I prevent it?

前端 未结 4 1503
小鲜肉
小鲜肉 2021-02-12 20:04

I\'m using the Fetch API both in the frontend and on the backend (NodeJS), a problem that I\'ve been facing a lot happens when parsing the response as json.

respon

相关标签:
4条回答
  • 2021-02-12 20:16

    Since response.json() returns a Promise, You can handle the error with catch and return a dummy data object.

    fetch('url').then(response => { 
      return response.json().catch(err => {
        console.error(`'${err}' happened, but no big deal!`);
        return {};
      });
    }).then(data => {
      console.log(data); 
    });
    

    Update

    As mentioned below, if you try to read response twice, you'll get an error: TypeError: Already Read.

    As a workaround, it you can clone the original response and call json on the cloned object.

    fetch('url').then(response => {
      const responseCopy = response.clone();
      return responseCopy.json().catch(_ => response.text());
    }).then(data => {
      console.log(data); 
    });
    
    0 讨论(0)
  • 2021-02-12 20:18

    Once you have the Response object, inspect the headers and see what Content-Length says. Based on that you can know whether or not there is something to parse. But also, it seems bogus for the server to return an application/json resource that is empty, as that is not JSON.

    0 讨论(0)
  • 2021-02-12 20:28

    It is easy, just check response body type like below:

    var contentType = response.headers.get('content-type')
            if (contentType && contentType.indexOf('application/json') !== -1) {
                return response.json();
            }else{
                //if response is not json and mostly empty
                return({})
            }
    

    it return empty object if response was null

    0 讨论(0)
  • 2021-02-12 20:32

    Why you don't handle error with try catch

    try {
        body = JSON.parse(body)
    } catch (err) {
    
    }
    
    0 讨论(0)
提交回复
热议问题