получить возвращение catch Неожиданный токен U в JSON в позиции 0 - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь выдать сообщение об ошибке, но оно выдает мне это сообщение: (используйте React и NodeJS)

return SyntaxError: Неожиданный токен U в JSON в позиции 0

   fetch("http://localhost:3000/api/register", options)
                .then(response => response.json())
                .then(user => {
                    alert('Registration successful !')
                    this.props.history.push("/"); 
                })
                .catch(err => {
                    console.error(err)
                    console.log(err.message)
                });
            }

на стороне сервера:

router.post('/', async (request, response) => {
    try {
        const user = request.body;
        const newUser = await registerLogic.addUser(user);
        if (newUser === 0) {
            throw "User name already exists";
        }
        if(newUser === 1){
            throw "Something is missing";
        }
        response.status(201).json(newUser);
    } catch (error) {
        console.log(error);
        response.status(500).send(error);
    }
});

Ответы [ 3 ]

3 голосов
/ 04 марта 2020

Ошибка Unexpected token U in JSON at position 0 в значительной степени говорит вам о том, что здесь происходит: первый символ JSON, который вы пытаетесь проанализировать, буквально является буквой «U».

Глядя на свой серверный код, вы выдаете ошибку «Имя пользователя уже существует», перехватываете эту ошибку и затем возвращаете это сообщение в качестве тела ответа. К сожалению, это недопустимо JSON, следовательно, ошибка.

Вместо этого попробуйте вернуть действительный ответ JSON, обновив свой оператор catch следующим образом:

try {
  // ...
} catch (error) {
  response
    .status(500)
    .send(JSON.stringify({ error }));
}
0 голосов
/ 04 марта 2020

Другие ответы хорошо относятся к вашей первоначальной проблеме. Чтобы ответить на ваши последующие вопросы

when i do it now it not get the catch and contine to .then and send me success message

Fetch не будет отклонять обещание для неудачных кодов состояния HTTP. Это может быть сюрпризом по сравнению с Angular или jQuery. Fetch только отклонит обещание об ошибках сетевого уровня, соединение оборвалось и т. Д. c.

Это указано в документах

То, что вы можете сделать вместо этого, это нечто например:

fetch("http://localhost:3000/api/register", options)
.then(async response => {
    if (!response.ok)
        throw new Error(await response.text());

    return response;
})
.then(response => response.json())
.then(user => {
    alert('Registration successful !')
    this.props.history.push("/"); 
})
.catch(err => {
    console.error(err)
    console.log(err.message)
});

Он проверит успешный код состояния HTTP и отклонит цепочку обещаний с ответом сервера, если это не так. Возможно, вы захотите создать собственное исключение, расширяющее класс Error, а не выбрасывать его напрямую.

0 голосов
/ 04 марта 2020

Ваш ответ не json, в вашем возвращаемом блоке перехвата json ответ.

} catch (error) {
    console.log(error);
    response.status(500);
    response.json({ message: error.message })
}

При получении проверьте код состояния, возвращенный из бэкэнда.

fetch("http://localhost:3000/api/register", options)
  .then(response => response.json())
  .then(user => {

    if (user.status !== 200) {
      alert('ERR', user);
      return;
    }

     alert('Registration successful !')
     this.props.history.push("/"); 
  })
   .catch(err => {
      console.error(err)
      console.log(err.message)
    });
 }
...