Ошибка: SyntaxError: неожиданный конец ввода JSON в fetch.then.response

Я получаю эту ошибку каждый раз, когда пытаюсь использовать метод POST в своем API.

SyntaxError: Unexpected end of JSON input at fetch.then.response 

Когда я использую метод GET, я обычно получаю данные. Это код:

const teste = () => {
fetch("myURL/test", {
    method: "POST",
    headers: {
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        id: 1,
        name: "Teste",
        amount: 1,
        value: 3
    })
})
.then(response => response.json()) //Here is the error
.then(data => {
    console.info(data);
})
.catch((err)=>console.info(err))}

Кто-нибудь может мне помочь? Спасибо.

Обновлено: Я просто добавляю эту строку, чтобы увидеть журнал:

.then(response => console.info(response))

Вот что я получил:

Response {
type: "cors",
url: "myURL/test",
redirected: false,
status: 201,
ok: true,
…}
body: (...)
bodyUsed: false
headers: Headers {}
ok: true
redirected: false
status: 201
statusText: ""
type: "cors"
: "myURL/test"
__proto__: Response

Ну и как на самом деле выглядит ответ?

Pointy 03.03.2019 19:15

@Pointy Я просто получаю эту ошибку: SyntaxError: неожиданный конец ввода JSON в fetch.then.response

Ricardo Sanches 03.03.2019 19:18

Что касается комментария @pointy, вы можете посмотреть, как выглядит ответ, заменив then(resp => resp.json()) на then(resp => resp.text()).then(console.info), и отредактировать свой ответ, включив записанный текст.

Nino Filiu 03.03.2019 19:18

Или просто посмотрите в инструментах разработчика браузера вкладку "Сеть"

Pointy 03.03.2019 19:23

@NinoFiliu Я сделал то, что ты сказал.

Ricardo Sanches 03.03.2019 19:27

Нет, это объект Response, я думаю, вы забыли resp => resp.text()

Nino Filiu 03.03.2019 19:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
6
15 298
4

Ответы 4

Это означает, что страница, полученная по адресу myURL/test, не отвечает содержимым JSON или с искаженным содержимым JSON. Это не ошибка вашего скрипта, все в порядке, это ошибка вашего сервера, который не обслуживает контент JSON в myURL/test.

Также обратите внимание, что серверы могут по-разному отвечать на запросы GET и POST для одного и того же URL-адреса! Если вы получаете действительный JSON из запроса GET, но, как вы описали, не можете получить действительный JSON из запроса POST, ваш сервер может обслуживать другой контент в зависимости от типа запроса. Исследуйте это.

Советы по отладке

  • Замените then(resp => resp.json()) на then(resp => resp.text()).then(console.info), чтобы увидеть, как выглядит обслуживаемый контент.
  • Используйте Postman для имитации вызовов API и посмотрите, как выглядит обслуживаемый контент, с более подробной информацией.
  • Изучите ответ с помощью инструментов разработчика:
    1. В Chrome
    2. Откройте консоль (F12)
    3. Перейти на вкладку network
    4. Нажмите на файловый сервер myURL/test
    5. Нажмите на response: это будет текстовое содержимое. Он должен быть правильно отформатирован JSON.

Инструменты разработчика браузера отобразят полный текст HTTP-запроса и ответа.

Pointy 03.03.2019 19:24

Конечно! Я отредактирую свой ответ, чтобы включить это. Я никогда не использовал инструменты разработчика как новичок, поэтому я думал только о том, чтобы предложить советы только по сценариям.

Nino Filiu 03.03.2019 19:25

@NinoFiliu Когда я использую метод GET, я получаю следующее: [ { "id": 1, "name": "Coca-Cola", "amount": 1, "value": 2.5 } ]

Ricardo Sanches 03.03.2019 19:31

Попробуйте опубликовать тело: { данные: { I'd: 1, имя: "test #"}}

Michael Knight 03.03.2019 19:32

@RicardoSanches, который вы получаете с помощью POST, но получаете действительный JSON только с помощью GET, поэтому ваш сервер обслуживает другой контент на основе POST/GET. Смотрите добавленный абзац в моем ответе.

Nino Filiu 03.03.2019 19:38

В основном метод GET не отправляет ваш объект тела на сервер, на котором вы получаете ответ. Только действие POST отправит ваш объект body на сервер.

Я предполагаю, что объект, который вы хотите отправить, является проблемой. Либо сервер, к которому вы пытаетесь подключиться, не ожидает объект body в виде строки, либо вам следует убедиться, что вы правильно проанализировали JSON перед обработкой.

Я думаю, ты прав. Я использую SwaggerHub для создания API, и я думаю, что это может быть проблемой.

Ricardo Sanches 04.03.2019 13:48

Похоже, API, который вы вызываете, не имеет тела ответа на этот конкретный POST. Затем, когда вы вызываете response.json() (преобразовывая response.body в json), возникает ошибка. Или, может быть, ответ: тело не является допустимым телом json.

Если вы хотите обработать эту ошибку более модно, вы можете сделать это так:

tryGetJson = async (resp) => {
    return new Promise((resolve) => {
      if (resp) {
        resp.json().then(json => resolve(json)).catch(() => resolve(null))
      } else {
        resolve(null)
      }
    })
  }

https://github.com/github/fetch/issues/268#issuecomment-399497478

(для тех, кто придет позже, но решит эту проблему)

Проблема, скорее всего, в ошибке сервера или неверном URL-адресе, но вы этого не видите, потому что во всех примерах в Интернете, как работать с fetch, отсутствует одна важная часть - сбой сервера или сети.

Я думаю, что правильный способ справиться с fetch — это проверить ответ, если он содержит ошибки, перед преобразованием в json.

Проверьте часть первого then в примере, где it.ok тестируется:

async function fetchData() {
    return await fetch('https://your-server.com/some-NOt-existing-url/')
        .then(it => {
            if (!it.ok) {
                throw `Server error: [${it.status}] [${it.statusText}] [${it.url}]`;
            }
            return it.json();
        })
        .then(receivedJson => {
            // your code with json here...
        })
        .catch(err => {
            console.debug("Error in fetch", err);
            setErrors(err)
        });
}

(примечание: it — это просто соглашение об именах, заимствованное из Kotlin, оно делает код JavaScript короче. Это псевдоним для всего, что находится в левой части выражения, в данном случае для response)

Другие вопросы по теме