Как использовать mongoose для обновления информации профиля пользователя

#javascript #node.js #express #mongoose

#javascript #node.js #экспресс #mongoose

Вопрос:

На стороне клиента пользователь может обновить свой профиль через форму, в которой данные отправляются через axios на серверную часть nodejs express. Я хочу использовать mongoose для обновления информации о пользователе. Вот что я пробовал:

 userRouter.post('/update/:username', (req, res) => {
  const update = {age: req.body.age, height: req.body.height, weight: req.body.weight, gender: req.body.gender}
  const filter = {username: req.params.username}
  User.findOneAndUpdate(filter, update, { new: true });
});

  

Комментарии:

1. В чем проблема?

2. В базе данных ничего не обновляется, и консоль сообщает, что запрос POST не удался.

3. Попробуйте User.findOneAndUpdate(filter, update, { new: true }, (err, doc) => {...})

4. ах, это сработало! Не могли бы вы объяснить, почему?

5. Вы можете прочитать об этом здесь: mongoosejs.com/docs/queries.html#executing

Ответ №1:

findOneAndUpdate метод User возвращает обещание и другой вариант, в котором он принимает обратный вызов. Вы не передали ничего, что вызвало эту ошибку. Вы можете попробовать подход обратного вызова или тот, который написан ниже.

 userRouter.post('/update/:username', async (req, res) => {
    const update = {age: req.body.age, height: req.body.height, weight: req.body.weight, gender: req.body.gender}
    const filter = {username: req.params.username}
    const updatedDocument = await User.findOneAndUpdate(filter, update, { new: true });

    return res.status(200).send(updatedDocument);
  });
  

Ответ №2:

В спецификации REST API при обновлении некоторых ресурсов на сервере вы должны использовать метод PATCH or PUT для запроса.

Вы используете POST метод.

Здесь вы можете сделать это так

Сначала получите имя пользователя и выполните поиск в базе данных, используя свойство filter. Теперь получите req.body и примените обновленные данные

 app.patch('/update/:username', (req, res) => {
  //You can pass req.body directly or you can separate object
  const { age, height, weight, gender } = req.body;
  const { username } = req.params;
  const filter = { username : username }

  const updatedUser = await User.findOneAndUpdate(filter, req.body, { new: true }).catch(error => {
    return res.status(500).send(error);
  });

  return res.status(200).json({
    message : "Updated user",
    data: updatedUser
  });
});
  

Ответ №3:

Это работает для меня, сначала создайте схему, а затем импортируйте ее в свой файл.

 import RegisterSchemaModel from '../schema/RegisterSchema.js';

router.post("/api/admin/epadmin",(req, res) => {
  const uData = {
    "name": req.body.name,
    "lname": req.body.lname,
    "mobile": req.body.mobile,
    "address":req.body.adddress,
    "city":req.body.city,
    "gender":req.body.gender
  }; // Data to be Updated 

  const cData = { "email": req.body.email }; // Conditional Data or Unqiue Key to fetch

  const updatedUser = RegisterSchemaModel.findOneAndUpdate(cData, uData,{new:true}).then((result) => {
    return res.send(result)
  }).catch(error => {
    return res.status(500).send(error);
  });

  return res.status(200).json({
    message : "Updated user",
    data: updatedUser
  });
});