mongoose findByIdAndUpdate не сохраняет изменения в бд

Есть функция изменения данных о пользователе в моём контроллере:

  async editUser(req, res) {
    try {
      const { username, password, name, surname, patronymic, userRole } =
        req.body;
      var hashPassword = bcrypt.hashSync(password, 5);
      User.findByIdAndUpdate(mongoose.Types.ObjectId(req.params.id), {
        username,
        password: hashPassword,
        name,
        surname,
        patronymic,
        roles: [userRole],
      });
      req.session.message = {
        iconStyle: "check",
        type: "check-Success",
        intro: "Успешно",
        message: "Информация обновлена.",
      };
      res.status(400).redirect("/users");
    } catch (e) {
      console.log(e);
      res.status(400).json({ message: "nt" });
    }
  }

Так-же роут:

router.post("/editUser/(:id)", controller.editUser);

И при отправке post запроса через postman функция изменения данных отрабатывает, меня ридеректит, но данные о пользователе не изменяются. req.body конечно заполнен полностью и req.params.id пренадлежит существующему пользователю. Я только учусь, подскажите - в чём может быть проблема?


Ответы (1 шт):

Автор решения: webtensei

В app.js подключаем модуль method-override

const methodOverride = require("method-override");
...
...
app.use(methodOverride("_method"));

в роутере используем post:

router.post("/editUser/(:id)", controller.editUser);

Сама функция // вводим переменную user, делаем запрос к бд, сохраняем данную переменную user.save() так-же используем { useFindAndModify: false }

async editUser(req, res) {
    try {
      const { username, password, name, surname, patronymic, userRole } =
        req.body;
      var hashPassword = bcrypt.hashSync(password, 5);
      let user = await User.findByIdAndUpdate(
        req.params.id,
        {
          username,
          password: hashPassword,
          name,
          surname,
          patronymic,
          roles: [userRole],
        },
        { useFindAndModify: false }
      );
      await user.save();
      req.session.message = {
        iconStyle: "check",
        type: "check-Success",
        intro: "Успешно",
        message: "Информация обновлена.",
      };
      res.status(400).redirect("/users");
    } catch (e) {
      console.log(e);
      res.status(400).json({ message: "nt" });
    }
  }
}
ejs шаблон формы со страницы

  <form class=""          
          action="/editUser/<%=AllUsers[i]._id%>?_method=PUT"
          method="post"
          name="form">

Данные решения помогли мне исправить проблемы, скорее всего основная проблема была в том, что я не использовал функцию save и не правильно обращался к бд, await bless rng

→ Ссылка