如何正确使用Mongoose中的findOneAndUpdate方法?
问题修复方案
核心问题点
findOneAndUpdate同时使用await异步语法和回调函数属于错误用法,两种异步处理逻辑冲突,导致无法拿到正确返回值- 若查询条件
{"username": "dennis"}在数据库中无匹配的Transaction文档,默认配置下该方法会直接返回null,不会抛出错误 findOneAndUpdate执行时已经完成数据库写入操作,后续额外调用.save()属于冗余逻辑,若返回值为null时调用该方法还会直接抛出异常
修复后代码
app.post("/transaction/update", isAdmin, async (req, res) => { try { const count = req.body.count const date = req.body.date const change = req.body.change const service = req.body.service const expires = req.body.expires const updatedDoc = await Transaction.findOneAndUpdate( { username: "dennis" }, { $set: { count: count, date: date, change: change, service: service, expires: expires } }, { new: true, // 若需要匹配不到文档时自动新建对应记录,开启下方配置 // upsert: true } ) console.log(updatedDoc) res.redirect("/admin") } catch (err) { console.log("更新错误:", err) res.status(500).send("操作失败") } })
额外验证步骤
如果修改后返回值仍为null,请先手动查询数据库确认是否存在username字段值为dennis的Transaction文档,检查字段名拼写、大小写是否和查询条件完全一致。
内容的提问来源于stack exchange,提问作者UsernameFound
相关产品推荐
相关产品推荐

