提问者:小点点

FindOneAndUpdate MongoDB与Mongoose更新用户配置文件不使用电子邮件?


我正在Express JS和Mongo DB中构建一个REST API。 我正在使用Mongoose包与数据库进行接口,并且正在尝试实现一个健壮的endpoint,以允许用户更新有关其帐户的详细信息,例如,他们的名字。

我的endpoint已经设置好了,我可以发送一个请求,但是,只有当我没有通过我想要更新的用户的电子邮件和密码(记住,我需要检查他们要将其更改为的电子邮件是否已经存在)时,它才可能起作用

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而不是对象,但是早些时候,由于某种原因,我得到了一个Mongo DB错误,代码为66。。。

这是怎么回事?

更新

当发送我的正文以更新用户时,我得到的响应为:{“operationtime”:“6845592053464694785”,“ok”:0,“code”:66,“codename”:“immutablefield”,“$clustertime”:{“clustertime”:“6845592053464694785”,“signature”:{“hash”:“+uhfhnsv5b60qr/yhd2qg8cd6ja=”,“keyid”:“6843771360993345539”}},“name”:“mongoerror”},尽管我


共1个答案

匿名用户

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

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

null

const user = new User({
    name: req.body.name,
    email: req.body.email,
    password: hashPassword
  })