Как правильно обрабатывать ошибки пользователя (действия)? - PullRequest
0 голосов
/ 21 мая 2018

Я ломаю голову, пытаясь найти лучший способ обработки ошибок от определенных действий пользователя.Я использую Express в качестве своего веб-сервера, и хотя он работает, по большей части я получаю не очень полезные, общие сообщения об ошибках.Например, в приведенном ниже коде я получаю сообщение об ошибке Request failed with status code 400 на стороне клиента для первых двух условий / исключений в блоке try.

Как мне подойти к этому в следующем примере?

Экспресс-контроллер на стороне сервера

async function voteInPoll (req, res) {
  const { category, pollId } = req.params;
  const { name, choiceId, voterId } = req.body;

  try {
    const poll = await Poll.findById(pollId);

    // Check if user has already voted in poll
    const hasVoted = poll.votedBy.some(voter => voter.equals(voterId));

    if (!voterId) { // Check if user is authenticated
      res
        .sendStatus(400)
        .json({ message: 'Sorry, you must be logged in to vote' });
    } else if (voterId && hasVoted) {
      res
        .sendStatus(400)
        .json({ message: 'Sorry, you can only vote once' });
    } else {
      const choice = await poll.choices.id(choiceId);
      const votedChoice = { name, votes: choice.votes + 1 };

      await choice.set(votedChoice);
      await poll.votedBy.push(voterId);
      poll.save();

      res
        .sendStatus(200)
        .json({
          message: 'Thank you for voting. Find other polls at: ',
          poll,
        });
    }
  } catch (error) {
    throw new Error(error);
  }
}

React / Redux Action

export const voteInPoll = (category, pollId, votedItem, voterId) => async dispatch => {
  try {
    const response = await axios.post(
      `http://localhost:3050/polls/${category}/${pollId}/vote`,
      {
        ...votedItem, 
        voterId,
      }
    );

    dispatch({ type: store.polls.VOTE_SUCCESS, payload: response.data.poll });
  } catch (error) {
    console.log(error);
    dispatch({ type: store.polls.VOTE_FAILURE, payload: error.message });
  }
};

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

Мне кажется довольно странным, что я получаю ожидаемый ответ об ошибке, как показано ниже на вкладке Сеть в инструментах разработчика Chrome.enter image description here

1 Ответ

0 голосов
/ 22 мая 2018

Не следует использовать res.sendStatus(statusCode) из-за следующего, как определено в документации здесь :

Устанавливает код состояния HTTP ответа в значение statusCode и отправляет его строковое представлениев качестве тела ответа.

Ключевым моментом в вышесказанном является:

и отправка его строкового представления в качестве тела ответа.

Таким образом: res.sendStatus(400).json({ message: 'Oops 400!'}) будет не даст вам ответ JSON, который вы ожидаете, но просто отобразит:

Bad Request

Что представляет собой строковое представление из 400 HTTP-кода состояния: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_errors

Что вам нужно сделать, это заменить все ваши res.sendStatus(..).json(..) на res.status(...).json(...) примерно так:

if (!voterId) { // Check if user is authenticated
  res
    .status(400)
    .json({ message: 'Sorry, you must be logged in to vote' });
} else if (voterId && hasVoted) {
  res
    .status(400)
    .json({ message: 'Sorry, you can only vote once' });
} else {
  // ...
}

и т. д.на.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...