使用fetch检查内容

时间:2017-02-21 23:23:25

标签: javascript json fetch-api

我使用fetch进行返回JSON数据的API调用。

有时,API调用会为内容返回状态 $ Name : Factor w/ 206 levels "A.Abdullah","A.Boldin",..: 68 199 79 120 120 79 68 27 68 150 ... $ Team : Factor w/ 31 levels "ARI","BAL","BUF",..: 9 9 9 4 4 9 9 9 9 4 ... $ Position : Factor w/ 3 levels "RB","TE","WR": 3 2 3 3 3 3 3 1 3 1 ... $ Yds : num 0 10 4 17 14 14 7 2 6 -3 ... $ Receptions: num 1 1 1 1 1 1 1 1 1 1 ... $ Targets : num 1 1 1 1 1 1 1 1 1 1 ... $ Ydslt10 : num 1 1 1 1 1 1 1 1 1 1 ... $ Ydsgt10 : num 0 0 0 0 0 0 0 0 0 0 ... OK。我依靠检查状态来获取内容,但这给了我一个错误,因为没有JSON数据。

我得到的错误是:null

这是我的典型获取模式,显然我需要通过再添加一个JSON数据检查来改进它。我该如何修改?

Uncaught (in promise) SyntaxError: Unexpected end of JSON input

我为fetchOptions创建了函数,例如GET或POST以及parseJSON。它们是简单的功能。这就是parseJSON的样子:

export const getSomeData = () => {

    return (dispatch) => fetch('/api/myapifunction', fetchOptionsGet())
        .then((response) => {
            if(response.ok) {
                // I need to add logic here to check for JSON data before calling parseJSON
                parseJSON(response)
                .then(data => {
                    // Do something
                })
            } else {
                // Failed
                // Handle failure
            }
        })
}

据我了解,response.json()只是一个承诺,不一定是数据。如何检查我是否收到任何JSON数据?

2 个答案:

答案 0 :(得分:2)

这里的诀窍是你的服务有点双重。它说的是OK,但是根本不发送任何字节。 JSON.parse('')抛出同样的错误。

您可以使用catch作为Dekel备注来解决此问题,或者您可以使用response.text()

if (response.ok) {
  response.text()
    .then(text => text && text.length ? response.json() : Promise.resolve({}))
    .then(data => { // here you'll need to handle an empty object

这基本上检查返回的字符串值。如果没有返回任何内容,它将为您提供一个空对象而不是抛出错误。这将有助于区分由于数据错误而导致的JSON解析错误,而根本没有数据。

答案 1 :(得分:1)

如果浏览器能够将响应内容解析为有效的json,response.json()承诺将正确运行并进入.then部分。

如果它无法执行此操作 - 您可以使用.catch查看问题所在:

parseJSON(response)
    .then(json => {
        // Do something with the json data
    }).catch( reason => {
        // response is not a valid json string
    })