node-fetch help - getting FetchError: invalid json response > body at <url> reason: > Unexpected end of JSON input

node-fetch help - getting FetchError: invalid json response > body at <url> reason: > Unexpected end of JSON input

我是 node.js 和 API 的新手,所以我希望有人能提供帮助!我正在尝试使用 node-fetch 从梦幻超级联赛 API 获取 JSON 数据。我已在客户端成功完成此操作,但从我的 node.js 服务器文件中我不断收到错误消息:

UnhandledPromiseRejectionWarning: FetchError: invalid json response body at https://fantasy.premierleague.com/api/entry/3/ reason: Unexpected end of JSON input

响应本身的状态为 200,但大小为 0,因此它不返回任何数据。我知道它应该可以工作,因为当您访问 url 时 JSON 是清晰可见的,并且我已经获取到客户端代码中的工作。

这是我使用的代码:

const fetch = require('node-fetch');

async function fetchEntry() {
    const api_url = 'https://fantasy.premierleague.com/api/entry/3/';
    const fetchEntry_response = await fetch(api_url);
    const json = await fetchEntry_response.json();
    console.log("json: " + JSON.stringify(json));
};

fetchEntry();

注意:在客户端代码中出现 CORS 错误,因此需要使用代理 (https://thingproxy.freeboard.io/fetch/https://fantasy.premierleague.com/api/entry/3/) 才能使其正常工作。我不确定这是否相关?

如有任何帮助,我们将不胜感激!

我认为您使用的 api 是问题所在。我试图让它工作,但得到了同样的错误。也尝试使用 axios 但它是同一回事。

我尝试使用 Postman 获取数据并且它运​​行良好,所以..我的猜测是您尝试使用的 api 不支持所有来源,因为 API 我尝试使用与您的代码完美配合。

const api_url = "https://randomuser.me/api";

不要问我为什么,但添加 'User-Agent' header 似乎可以解决问题:

const response = await fetch(URL, {
  headers: {
    'User-Agent': 'ANYTHING_WILL_WORK_HERE'
  }
});

我在 运行 测试用例时遇到了同样的问题。在我的测试用例中,有 API 调用,我使用 useEffect 反应挂钩来更新状态。

 useEffect(() => {
    getDetailsFromAPI("param")
}, []);

所以,当 运行 测试用例时,我遇到了同样的错误

 FetchError: invalid json response body at  reason: Unexpected end of JSON input

  at ../../node_modules/node-fetch/lib/index.js:272:32

为了解决这个错误,我在测试用例中模拟了 promise,这解决了我的问题。

import fetch from 'node-fetch';

const mockJsonPromise = Promise.resolve(mydata); // 2
    const mockFetchPromise = Promise.resolve({ // 3
        json: () => mockJsonPromise,
        ok: () => true
    });
    fetch.mockImplementation(() => mockFetchPromise);