Ошибка почтальона: TypeError: Невозможно установить свойство 'username' для null - PullRequest
0 голосов
/ 08 октября 2019

Я возился с той же ошибкой, код отлично работает для добавления, получения и удаления записей, но выдает ошибку Почтальону, когда я пытаюсь отправить запрос на обновление. Одна и та же ошибка преобладает как у Почтальона, так и у Бессонницы.

    const router = require("express").Router();
    let Exercise = require("../models/exercise.model");

    router.route("/").get((req, res) => {
      Exercise.find()
        .then(exercises => res.json(exercises))
        .catch(err => res.status(400).json("Error: " + err));
    });

    router.route("/add").post((req, res) => {
      const username = req.body.username;
      const description = req.body.description;
      const duration = Number(req.body.duration);
      const date = Date.parse(req.body.date);

      const newExercise = new Exercise({
        username,
        description,
        duration,
        date
      });

      newExercise
        .save()
        .then(() =>
          res
            .json("Exercise added!")
            .catch(err => res.status(400).json("Error: " + err))
        );
    });

    router.route("/:id").get((req, res) => {
      Exercise.findById(req.params.id)
        .then(exercise => res.json(exercise))
        .catch(err => res.status(400).json("Error: " + err));
    });

    router.route("/:id").delete((req, res) => {
      Exercise.findByIdAndDelete(req.params.id)
        .then(() => res.json("Exercise deleted."))
        .catch(err => res.status(400).json("Error: " + err));
    });

    router.route("/update/:id").post((req, res) => {
      Exercise.findById(req.params.id)
        .then(exercise => {
          exercise.username = req.body.username;
          exercise.description = req.body.description;
          exercise.duration = Number(req.body.duration);
          exercise.date = Date.parse(req.body.date);

          exercise
            .save()
            .then(() => res.json("Exercise Updated!"))
            .catch(err => res.status(400).json("Error: " + err));
        })
        .catch(err => res.status(400).json("Error: " + err));
    });

    module.exports = router;

Тело для POST:

{
    "username": "Omer Mustafa",
    "description": "Walk",
    "duration": "120",
    "date": "2019-10-07T11:19:09.424Z"
}

Я следую руководству по эксперименту по созданию простого приложения mern: https://www.youtube.com/watch?v=7CqJlxBYj-M

1 Ответ

0 голосов
/ 08 октября 2019

mongoose FindById не выдает исключение, если данных не существует, но возвращает ноль. Поэтому перед использованием необходимо проверить, не являются ли данные нулевыми. Вам просто нужно добавить эту проверку:

if (!exercise) return res.status(404).send();

Итак, весь код, связанный с обновлением, теперь выглядит так:

router.route("/update/:id").post((req, res) => {
  Exercise.findById(req.params.id)
    .then(exercise => {

      if (!exercise) return res.status(404).send();

      exercise.username = req.body.username;
      exercise.description = req.body.description;
      exercise.duration = Number(req.body.duration);
      exercise.date = Date.parse(req.body.date);

      exercise
        .save()
        .then(() => res.json("Exercise Updated!"))
        .catch(err => res.status(400).json("Error: " + err));
    })
    .catch(err => res.status(400).json("Error: " + err));
});

...