Обновление БД Shema в Express JS с библиотекой Mon goose - PullRequest
1 голос
/ 02 февраля 2020

Я создал схему БД Mon go с Mon goose в Express. js, и я строю REST API. Однако, когда я пытаюсь обновить существующие записи, значения, которые я не обновляю из схемы, автоматически становятся нулевыми. Я понимаю, почему это происходит, просто не уверен, как именно это должно быть закодировано.

Это маршрут:

router.patch("/:projectId", async (req, res) => {
  try {
    const updatedProject = await Project.updateOne(
      { _id: req.params.projectId },
      {
        $set: {
          title: req.body.title,
          project_alias: req.body.project_alias,
          description: req.body.description
        }
      }
    );
    res.json(updatedProject);
  } catch (err) {
    res.json({ message: err });
  }
});

также вот схема:

const ProjectsSchema = mongoose.Schema({
  title: {
    type: String,
    required: true,
    unique: true
  },
  project_alias: {
    type: String,
    unique: true,
    required: true
  },
  description: String,
  allowed_hours: Number,
  hours_recorded: {
    type: Number,
    default: 0
  },
  date_added: {
    type: Date,
    default: Date.now
  }
});

Моя проблема в том, что когда я хочу обновить только заголовок:

{
    "title" : "Title Updated33"
}

описание и псевдоним становятся пустыми. Должен ли я осуществить проверку?

1 Ответ

1 голос
/ 02 февраля 2020

Просто используйте req.body для объекта обновления следующим образом:

router.patch("/:projectId", async (req, res) => {

  try {
    const updatedProject = await Project.updateOne(
      { _id: req.params.projectId },
      req.body
    );
    res.json(updatedProject);
  } catch (err) {
    res.json({ message: err });
  }
});

Или даже лучше, создайте вспомогательную функцию, подобную этой, чтобы мы могли исключить поля в теле, которые не существуют в модель:

const filterObj = (obj, ...allowedFields) => {
  const newObj = {};
  Object.keys(obj).forEach(el => {
    if (allowedFields.includes(el)) newObj[el] = obj[el];
  });
  return newObj;
};

router.patch("/:projectId", async (req, res) => {
  const filteredBody = filterObj(
    req.body,
    "title",
    "project_alias",
    "description",
    "allowed_hours",
    "hours_recorded"
  );

  try {
    const updatedProject = await Project.updateOne(
      { _id: req.params.projectId },
      filteredBody
    );
    res.json(updatedProject);
  } catch (err) {
    res.json({ message: err });
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...