справка по выборке узла — получение ошибки выборки: неверный ответ json > тело в причина: > Неожиданный конец ввода JSON

#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);