簡體   English   中英

UnhandledPromiseRejectionWarning: FetchError: invalid 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM