Mongoose中findOneAndUpdate回调报错,如何替换回调实现?
解决Mongoose中
Query.prototype.exec()不再接受回调的问题 Mongoose 6及以上版本彻底移除了exec()方法的回调参数支持,所以你不能再通过exec(callback)的方式处理查询结果,必须改用Promise风格或async/await来处理异步逻辑。以下是针对你的Express PUT路由的具体解决方案:
方案1:使用async/await(推荐,代码更简洁易读)
将路由处理函数标记为async,用await等待Mongoose查询的Promise结果,配合try/catch捕获错误:
const express = require('express'); const router = express.Router(); const Article = require('../models/Article'); // 替换为你的Article模型路径 router.put('/articles/:articleTitle', async (req, res) => { try { // 从请求体获取更新数据 const { title, content } = req.body; // 执行更新操作,直接await查询结果 const updatedArticle = await Article.findOneAndUpdate( { title: req.params.articleTitle }, // 查询条件:匹配URL中的文章标题 { title, content }, // 要更新的字段 { new: true, // 返回更新后的文档(默认返回更新前的) runValidators: true // 运行模型的验证规则,确保数据合法 } ); if (!updatedArticle) { return res.status(404).json({ message: '目标文章不存在' }); } // 更新后的逻辑处理:返回成功响应 res.status(200).json({ msg: '文章更新成功', data: updatedArticle }); } catch (err) { // 处理错误:比如验证失败、数据库连接问题 res.status(500).json({ msg: err.message }); } });
方案2:使用Promise的.then().catch()
如果不想用async/await,也可以直接利用Mongoose查询返回的Promise,通过链式调用处理结果:
const express = require('express'); const router = express.Router(); const Article = require('../models/Article'); router.put('/articles/:articleTitle', (req, res) => { const { title, content } = req.body; Article.findOneAndUpdate( { title: req.params.articleTitle }, { title, content }, { new: true, runValidators: true } ) .then(updatedArticle => { if (!updatedArticle) { return res.status(404).json({ message: '目标文章不存在' }); } res.status(200).json({ msg: '文章更新成功', data: updatedArticle }); }) .catch(err => { res.status(500).json({ msg: err.message }); }); });
关键注意点
- 不需要再调用
exec():Mongoose的查询方法(比如findOneAndUpdate)本身已经返回Promise,直接await或链式调用即可,调用exec()也可以,但不再接受回调参数 new: true是必要配置:默认情况下findOneAndUpdate返回更新前的文档,设置该参数才能拿到更新后的结果runValidators: true:确保更新时触发模型定义的验证规则,避免存入不符合要求的数据
内容的提问来源于stack exchange,提问作者HARSH SHUKLA
相关产品推荐
相关产品推荐

