【问题标题】:FindOneAndUpdate MongoDB with Mongoose updating user's profile not working with email?FindOneAndUpdate MongoDB 与 Mongoose 更新用户的个人资料不使用电子邮件?
【发布时间】:2020-07-04 11:33:00
【问题描述】:

我正在 Express JS 和 Mongo DB 中构建一个 REST API。我正在利用 Mongoose 包与数据库交互,并尝试实现一个强大的端点,以允许用户更新有关其帐户的详细信息,例如他们的姓名。

我的端点已设置,我可以发送请求,但是,它似乎只有在我不通过我要更新的用户的电子邮件和密码时才有效(请记住,我需要检查他们将其更改为的电子邮件尚不存在)

router.patch('/update', verify, async (req, res) => {

  // validate incoming data
  const { error } = registerValidation(req.body) 
  if (error) return res.status(400).send(error.details[0].message)

  // check if user already exists
  const emailExists = await User.findOne({ email: req.body.email })
  if (emailExists) return res.status(400).send('Email already exists')

  // hash password
  const salt = await bcrypt.genSalt(10)
  const hashPassword = await bcrypt.hash(req.body.password, salt)

  // update user
  const user = new User({
    name: req.body.name,
    email: req.body.email,
    password: hashPassword
  })
  
  User.findOneAndUpdate({ _id: req.user.id }, user, { runValidators: true, useFindAndModify: false, new: true }, (error, result) => {
    if (error) {
      console.log('error')
      return res.status(400).send(error)
    }

    res.status(200).send(result)
  });

})

首先,我得到的是一个返回的1 而不是一个对象,但之前由于某种原因,我得到了一个带有66 代码的 Mongo DB 错误...

这是怎么回事?

更新

当我发送我的正文以更新用户时,我收到了以下回复:{"operationTime":"6845592053464694785","ok":0,"code":66,"codeName":"ImmutableField","$clusterTime":{"clusterTime":"6845592053464694785","signature":{"hash":"+uHFhNsV5B60qR/Yhd2qg8Cd6jA=","keyId":"6843771360993345539"}},"name":"MongoError"},尽管我只编辑了三个字段中的 名称

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    首先,您应该获得一个字段来进行查询。您应该知道 _id 或者您应该知道以前的电子邮件或任何唯一字段值。

    您通过以下代码创建了一个新用户。但是这个创建的用户也会有一个唯一的 id。

    const user = new User({
        name: req.body.name,
        email: req.body.email,
        password: hashPassword
      })
    但是如果你需要更新,你不应该创建一个新用户。 用户永远不知道他的身份。因此,您应该使用任何其他字段(例如电子邮件)来查询您的数据。您可能需要此代码

    await User.findByIdAndUpdate({email:req.body.existingemail},{
        name: req.body.name,
        email: req.body.email,
        password: hashPassword
      })
    所以对你有帮助的代码可能是这样的,

    router.patch('/update', verify, async (req, res) => {
    
        // validate incoming data
        const { error } = registerValidation(req.body) 
        if (error) return res.status(400).send(error.details[0].message)
      
        // check if user already exists
        const emailExists = await User.findOne({ email: req.body.email })
        if (emailExists) return res.status(400).send('Email already exists')
      
        // hash password
        const salt = await bcrypt.genSalt(10)
        const hashPassword = await bcrypt.hash(req.body.password, salt)
      
        // update user
        const user ={
          name: req.body.name,
          email: req.body.email,
          password: hashPassword
        }
        //make sure you pass existingemail in postman
        User.findOneAndUpdate({ email:req.body.existingemail }, user, { runValidators: true, useFindAndModify: false, new: true }, (error, result) => {
          if (error) {
            console.log('error')
            return res.status(400).send(error)
          }
      
          res.status(200).send(result)
        });
      
      })

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2021-07-10
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多