Как правильно отображать ошибки на стороне сервера в клиенте для Node / Express? - PullRequest
0 голосов
/ 03 мая 2018

Я установил простой сервис Node / Express, который создает новые закладки в базе данных.

В моей схеме закладок одно из полей, url, имеет проверки. Когда вы пытаетесь создать новую закладку без правильных проверок, она выдает ошибку и сообщение.

например. если вы не предоставите URL для запроса, он выдаст сообщение Please provide a url.

Маршрут запроса POST для создания новой закладки:

app.post(
    '/api/bookmarks',
    (req, res) => {
      const { url, tags } = req.body;

      const bookmark = new Bookmark({
        url,
        tags
      });

      bookmark.save()
        .then(res => {
          res.send(result)
        })
        .catch(error => {
          console.log("err:", error);
          res.status(400).send(error)
        });
    }
  );

Как выглядит моя схема закладок:

const bookmarkSchema = new Schema({
  url: {
    type: String,
    required: [true, "Please provide a URL."],
    match: [urlRegex, "Your URL is invalid. Please make sure to add www."]
  },
  tags: [String]
});

Когда я выполняю вызов API на клиентском интерфейсе (например, через React), я могу перехватить сообщение об ошибке и последующее сообщение (Please provide a URL.), но, как вы можете видеть, мне нужно вызвать err.response.data.errors.url.message, который кажется очень многословным и многословным.

axios.post('http://localhost:5000/api/bookmarks', { tags: ["banana", "orange"] })
  .then(result => console.log('Result:', result.data))
  .catch(err => console.log('Error:', err.response.data.errors.url.message));

О чем я думаю - есть ли лучший способ визуализировать ошибки здесь? Будет ли лучше обрабатывать ошибки на стороне клиента?

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

Спасибо!

1 Ответ

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

Как то так. Так что вам не нужно проверять это в схеме.

app.post(
    '/api/bookmarks',
    (req, res) => {
      const { url, tags } = req.body;
      if (!url) {
        res.status(400).send({error: "URL is missing"})
        return;
      }
      if (!url.match(urlRegex) {
        res.status(400).send({error: "URL is not valid"})
        return;
      }
      const bookmark = new Bookmark({
        url,
        tags
      });

      bookmark.save()
        .then(res => {
          res.send(result)
        })
        .catch(error => {
          console.log("err:", error);
          res.status(500)
        });
    }
  );

Неправильно отправлять ошибки на стороне сервера во внешний интерфейс. Это простой способ утечки информации о вашей базе данных / бэкэнде. Вы должны отправить собственное строковое сообщение вместо уловленной ошибки.

...