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);
我是 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);