无法使用Mongoose查找OneAndUpdate用户模型

eivgtgni  于 9个月前  发布在  Go
关注(0)|答案(3)|浏览(87)

我目前正在建立我的应用程序使用Express和 Mongoose 后端。我希望能够更新新的详细信息现有的用户。
目前,我的流程是用户使用/signup端点和电子邮件/密码。然后他们使用/login端点获取令牌。
我能够成功地将具有GET的用户获取到/profile端点,但我希望能够使用JSON对象将POST获取到/profile端点,并将这些值添加到用户模型中。
我看了 Mongoose 的文档和这里,似乎没有什么对我有用。
我知道我得到了正确的用户,但它甚至没有被更新。即使当我检查数据库时,它也没有更新。
而catch并没有捕捉到任何错误。

router.post('/profile', async (req, res, next) => {
  const { _id } = req.user;
  const { firstName, lastName, role } = req.body;

  try {
    const user = await UserModel.findOneAndUpdate(
      { _id: _id },
      {
        $set: {
          firstName,
          lastName,
          role,
        },
      }
    );
    console.log(user);
  } catch (error) {
    console.error('Error updating user:', error);
    res.status(500).json({ message: 'Internal Server Error' });
  }

  res.send({});
});

字符串

l7wslrjt

l7wslrjt1#

使用findByIdAndUpdate会更好,因为需要通过文档的ObjectId找到它。此外,需要添加{new: true}以返回修改后的文档:

router.post('/profile', async (req, res, next) => {
  const { _id } = req.user;
  const { firstName, lastName, role } = req.body;

  try {
    const user = await UserModel.findByIdAndUpdate(
      _id,
      {
          firstName,
          lastName,
          role
      },
      { new: true }
    );
    console.log(user);
  } catch (error) {
    console.error('Error updating user:', error);
    res.status(500).json({ message: 'Internal Server Error' });
  }

  res.send({});
});

字符串
作为另一种选择,您可以使用then-catch而不是try-catch来使代码更简单,更清晰:

return await UserModel.findByIdAndUpdate(
      _id,
      {
          firstName,
          lastName,
          role
      },
      { new: true }
    )
    .then(user => {
         console.log(user);
         return res.send({});
    })
    .catch(error => {
         console.error('Error updating user:', error);
         return res.status(500).json({ message: 'Internal Server Error' });
    });


此外,如果req.body只包含更新字段,那么您可以将其用作一种简短的方式:
(但是,通过从请求中获取属性来创建更新模型会更清晰!)

const updatedUserModel = req.body;
await UserModel.findByIdAndUpdate(_id, updatedUserModel, { new: true });


这里是文档链接:Mongoose - findByIdAndUpdate
霍普,这很清楚也很有帮助

uxh89sit

uxh89sit2#

需要在fincOneAndUpdate对象中设置**new:true**。

0ejtzxu1

0ejtzxu13#

我解决了。我会怪我是新手而且太晚了。
但是我在UserModel上没有新的字段,所以mongoose不知道如何处理新的数据。
当我将字段添加到UserModel中时,我的代码第一次工作。
谢谢大家的帮助,它确实有助于调试。

相关问题