Mongoose报错:Model.findOneAndUpdate()不再支持回调函数
报错信息(中文翻译)
MongooseError: Model.findOneAndUpdate() 不再接受回调函数
在 Function.Model.findOneAndUpdate (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\mongoose\lib\model.js:2398:11)
在 getOne (file:///C:/Users/Kous/Desktop/First-Full-Stack/controllers/PostController.js:40:13)
在 Layer.handle [as handle_request] (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\layer.js:95:5)
在 next (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\route.js:144:13)
在 Route.dispatch (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\route.js:114:3)
在 Layer.handle [as handle_request] (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\layer.js:95:5)
在 C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\index.js:284:15)
在 param (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\index.js:365:14)
在 param (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\index.js:376:14)
在 Function.process_params (C:\Users\Kous\Desktop\First-Full-Stack\node_modules\express\lib\router\index.js:421:3)
问题原因
你使用的Mongoose版本已移除了对findOneAndUpdate回调参数的支持,该方法现在仅返回Promise,必须用Promise链或async/await语法处理结果。
修改后的代码
export const getOne = async (req, res) => { try { const postId = req.params.id const doc = await PostModel.findOneAndUpdate( { _id: postId }, { $inc: { viewsCount: 1 } }, { returnDocument: 'after' } ) if (!doc) { return res.status(404).json({ message: "post not found" }) } res.json(doc) } catch (error) { console.log(error) res.status(500).json({ message: "cant return post" }) } }
关键修改点
- 为
getOne函数添加async关键字,允许内部使用await - 移除
findOneAndUpdate的回调参数,改用await直接接收更新后的文档 - 原回调中的错误逻辑合并到外层
try/catch,Promise的reject会自动被catch捕获 - 修正了原代码中
cant retunr post的拼写错误
内容的提问来源于stack exchange,提问作者Kous Takken

