Ошибка: SyntaxError: Неожиданный конец ввода JSON в fetch.then.response - PullRequest
0 голосов
/ 03 марта 2019

Я получаю эту ошибку каждый раз, когда пытаюсь использовать метод 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.log(data);
})
.catch((err)=>console.log(err))}

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

РЕДАКТИРОВАТЬ: я просто добавить эту строку, чтобы увидеть журнал:

.then(response => console.log(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

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

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

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

0 голосов
/ 03 марта 2019

Похоже, что 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

0 голосов
/ 03 марта 2019

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

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

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

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