簡體   English   中英

FindOneAndUpdate MongoDB 與 Mongoose 更新用戶的配置文件不與 email 一起使用?

[英]FindOneAndUpdate MongoDB with Mongoose updating user's profile not working with email?

我正在 Express JS 和 Mongo DB 中構建 REST API。 我正在使用 Mongoose package 與數據庫交互,並嘗試實現一個強大的端點,以允許用戶更新有關其帳戶的詳細信息,例如他們的姓名。

我的端點已設置,我可以發送請求,但是,它似乎只有在我不通過 email 和我想要更新的用戶的密碼時才有效(請記住,我需要檢查他們的 email重新將其更改為不存在)

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而不是 object,但早些時候我因為某種原因得到了代碼為66的 Mongo DB 錯誤......

這里發生了什么?

更新

發送我的正文以更新用戶時,我收到以下響應: {"operationTime":"6845592053464694785","ok":0,"code":66,"codeName":"ImmutableField","$clusterTime":{"clusterTime":"6845592053464694785","signature":{"hash":"+uHFhNsV5B60qR/Yhd2qg8Cd6jA=","keyId":"6843771360993345539"}},"name":"MongoError"} ,即使我只有從三個字段中編輯了名稱

郵遞員設置

首先,您應該獲得一個字段來進行查詢。 您應該知道 _id 或者您應該知道以前的 email 或任何唯一字段值。

您通過以下代碼創建了一個新用戶。 但是這個創建的用戶也將有一個唯一的 id。

 const user = new User({ name: req.body.name, email: req.body.email, password: hashPassword })
但是如果你需要更新,你不應該創建一個新用戶。 用戶永遠不知道他的身份。 因此,您應該使用 email 等任何其他字段來查詢您的數據。 您可能需要此代碼

 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) }); })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM