我使用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数据?
答案 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
})