[英]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 })
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.