-3

我得到的错误:

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。

我能做些什么来防止这种情况发生?

网址结构:

1) 域

2) api版本

3) 端点

4)请求东西(最长的部分)

5)最后的id

看起来像这样:https://example.com/v1/endpoint/query?query=long_part_here&ids=2145132,532532,535

4

1 回答 1

0

如果预计“long_part”很长,这听起来像是一个设计不佳的 api。GET它应该使用请求而不是请求,POST以便可以在body对象中发送长数据集。你能看到 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);

这假定将结果全部合并到一个对象中是合理的。如果它们应该保持不同,您可以then像这样更改最后一个:

.then(json => combined = {...combined, {`url${count}`: json}};

其中count是您每次递增的整数,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);
于 2019-11-10T09:13:11.140 回答