Неожиданный токен в JSON в позиции 1 - PullRequest
4 голосов
/ 20 марта 2019

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

SyntaxError: Неожиданный токен u в JSON в позиции 1 в JSON.parse ()

Это произошло, когда я тестировал свой полный код, поэтому я проверил с помощью

res.send(JSON.stringify({"data": "test"}));

На стороне клиента я использую этот код:

fetch(url)                                   // fetch works
    .then(checkStatus)                       // checks for errors, if none send response text
    .then(function (responseText) {
        let data = JSON.parse(responseText); // where I'm getting the error

При тестированиизначения, все на моей стороне сервера печатает правильные значения.Однако, когда я использую console.log для распечатки responseText на стороне клиента, я получаю это:

f text () {[native code]}

Почему эта ошибка вызывается?Из анализа переполнения стека я понимаю, что эта ошибка возникает, когда я пытаюсь проанализировать строку, которая не определена.Я поставил оператор if перед анализом, чтобы проверить, что строка не определена:

if (responseText === undefined) {
    console.log("responseText is undefined");
}

Но она не выводится, так что строка действительно не определена?Как примечание, узел обновлен.Спасибо за помощь. Если ответ на другой вопрос, пожалуйста, дайте мне знать.Я не нашел решения этой проблемы.

Редактировать:

function checkStatus(response) {
    if (response.status >= 200 && response.status < 300) {
        return response.text;
    } else if (response.status === 404) {
        clear();
        return Promise.reject(new Error("Sorry, we couldn't find that page"));
    } else {
        console.log(response.text());
        return Promise.reject(new Error(response.status + ": " + response.statusText));
    }
}

Редактировать: response.text должен быть response.text ().Это дало мне мою ошибку.

1 Ответ

1 голос
/ 20 марта 2019

Обновлено, чтобы соответствовать новому коду вопроса

Цепочка обещаний разрешает каждое новое обещание с возвращаемым значением из последнего.

Обратите внимание, что API fetch() возвращает Promise разрешение с помощью объекта Response.У него нет text свойства , поэтому checkStatus разрешается с undefined (отсюда и «u» в сообщении об ошибке).

Я предлагаю вам использовать Body.json() метод для анализа ответа JSON, т. Е. Измените checkStatus на использование

if (res.ok) { // same as checking status between [200, 300)
  return res.json()
}
if (res.status === 404) {
  clear()
  return Promise.reject(new Error("Sorry, we couldn't find that page"))
}
// text(), like json() returns a promise
return res.text().then(responseText => {
  console.error(responseText)
  return Promise.reject(new Error(`${res.status}: ${res.statusText}`))
})

и на fetch() ...

fetch(url)
  .then(checkStatus)
  .then(data => {
    // data is already parsed into an object
  })

На стороне сервера вы, возможно, захотите использовать res.json() вместо того, чтобы вручную систематизировать ваши данные

res.json({ data: 'test' })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...