如何解决MongooseError: Model.findOne()不再接受回调函数的错误
解决MongooseError: Model.findOne()不再接受回调函数的问题
原因
Mongoose 6.x及后续版本彻底移除了对回调函数的支持,findOne()这类查询方法现在仅返回Promise对象,不再接收回调作为参数,这就是触发该错误的核心原因。
解决方案
1. 使用async/await(推荐方案)
将原有的回调写法改为异步函数结合await的形式,代码结构更简洁易读:
错误示例代码:
Model.findOne({ _id: someId }, (err, doc) => { if (err) { /* 错误逻辑处理 */ } // 文档处理逻辑 });
修正后的代码:
// 在异步函数内执行查询 async function fetchDocument() { try { const doc = await Model.findOne({ _id: someId }); // 文档处理逻辑 } catch (err) { // 错误逻辑处理 console.error(err); } } fetchDocument();
如果是在Express等框架的路由中,可以直接将路由处理函数声明为async:
app.get('/document/:id', async (req, res) => { try { const doc = await Model.findOne({ _id: req.params.id }); res.send(doc); } catch (err) { res.status(500).send(err.message); } });
2. 使用Promise链式调用
若更习惯Promise语法,也可以用then/catch处理结果:
Model.findOne({ _id: someId }) .then(doc => { // 文档处理逻辑 }) .catch(err => { // 错误逻辑处理 console.error(err); });
额外提示
- 除了
findOne(),Mongoose中所有原支持回调的方法(如find()、save()、deleteOne()等)在6.x+版本都不再接受回调,都需要改用Promise或async/await方式处理。 - 若坚持使用回调写法,可以降级Mongoose到5.x版本,但不推荐——5.x版本已停止维护,存在安全风险。
内容的提问来源于stack exchange,提问作者Prafulla Dhake
相关产品推荐
相关产品推荐

