[英]Node FetchError: invalid json response body - unexpected token < in JSON
[英]UnhandledPromiseRejectionWarning: FetchError: invalid json response body at
我得到的錯誤:
UnhandledPromiseRejectionWarning: FetchError: invalid json response body at {url}
reason: Unexpected token < in JSON at position 0
我的代碼:
const fetch = require('node-fetch');
const url = 'Reeeealy long url here';
fetch(url)
.then(res => res.json())
.then(console.log);
問題是如果 url 長於 ~8k+ 個字符 api 返回
400 Bad Request
Request Header Or Cookie Too Large
nginx
顯然我無法控制 api。
我能做些什么來防止這種情況發生?
url結構:
1) 域
2) api 版本
3) 端點
4)請求東西(最長的部分)
5)最后的id
看起來像這樣: https://example.com/v1/endpoint/query?query=long_part_here&ids=2145132,532532,535
如果預計“long_part”很長,這聽起來像是設計不佳的 api。 它應該使用POST
而不是GET
請求,以便可以在body
object 中發送長數據集。 您能否查看 API 是否允許端點的 POST 版本允許這樣做?
如果沒有POST
可用,並且您不控制 API,那么您沒有太多選擇。 我唯一能想到的是,如果可行的話,您將請求分解為多個單獨的端點調用(可能每個id
一個),並且會導致每個請求的url
大小更短。
如果您能夠執行多個較小的請求,則代碼可能如下所示:
const urls = ["firstUrl","secondUrl","nthUrl"];
let combined = {};
for (const url of urls) {
fetch(url)
.then(res => res.json())
.then(json => combined = {...combined, ...json};
}
console.log(combined);
這假設將結果全部合並到一個 object 是合理的。 如果它們應該保持不同,您可以像這樣更改then
一個:
.then(json => combined = {...combined, {`url${count}`: json}};
其中count
是一個 integer ,您每次遞增並combined
看起來像
{url1: {/*json from url1*/}, url2: {/*json from url2*/}, ...}
為了更優雅地處理錯誤,您應該在假設返回JSON
之前檢查結果。 您收到JSON
解析錯誤,因為返回的數據不是JSON
。 它是HTML
所以以<
開頭時失敗了。 你可以這樣做:
fetch(url)
.then(res => {
if (res.resultCode == "200") return res.json();
return Promise.reject(`Bad call: ${res.resultCode}`);
})
.then(console.log);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.