#javascript #node.js #fetch-api #node-fetch
#javascript #node.js #fetch-api #выборка узла
Вопрос:
Я новичок в node.js и поэтому я надеюсь, что кто-нибудь сможет помочь! Я пытаюсь использовать node-fetch для получения данных JSON из API fantasy premier league. Я успешно сделал это в клиенте, но из моего node.js файл сервера Я продолжаю получать сообщение об ошибке:
Предупреждение о необработанном promiserejectionwarning: ошибка выборки: неверное тело ответа json в https://fantasy.premierleague.com/api/entry/3 / причина: Неожиданное завершение ввода JSON
Сам ответ имеет статус 200, но размер равен 0, поэтому он не возвращает никаких данных. Я знаю, что это должно сработать, поскольку JSON хорошо виден при посещении URL-адреса, и у меня есть выборка для работы в коде на стороне клиента.
Вот код, который я использую:
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 /) чтобы заставить его работать. Я не уверен, имеет ли это отношение к делу?
Любая помощь будет с благодарностью!
Джо
Ответ №1:
Не спрашивайте меня, почему, но добавление заголовка User-Agent, похоже, исправляет это:
const response = await fetch(URL, {
headers: {
'User-Agent': 'ANYTHING_WILL_WORK_HERE'
}
});
Комментарии:
1. Это сработало отлично! Большое вам спасибо 🙂
2. const response = ожидание выборки (URL, {метод: ‘POST’, тело: JSON.stringify({ locale: «en-EN», тип: «сообщение», от: { id: «user1» }, текст: «привет» }), заголовки: { ‘Авторизация’:
Bearer ${webchat_secret}
, ‘Content-Type’: ‘application/json’, ‘User-Agent’: ‘ANYTHING_WILL_WORK_HERE’ } })
Ответ №2:
Я думаю, что проблема в API, который вы используете. Я попытался заставить это работать, но получил ту же ошибку. Также пытался использовать axios, но это то же самое.
Я попытался получить данные с помощью Postman, и это сработало отлично, так что … я предполагаю, что api, который вы пытаетесь использовать, не поддерживает all origin, поскольку API, который я пытался использовать, отлично работает с вашим кодом.
const api_url = "https://randomuser.me/api";
Ответ №3:
Я столкнулся с той же проблемой при запуске тестовых примеров. В моем тестовом примере был вызов 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
Для устранения этой ошибки я смоделировал обещание в тестовом примере, что решило мою проблему.
import fetch from 'node-fetch';
const mockJsonPromise = Promise.resolve(mydata); // 2
const mockFetchPromise = Promise.resolve({ // 3
json: () => mockJsonPromise,
ok: () => true
});
fetch.mockImplementation(() => mockFetchPromise);