Mongoose v7.0.3中Model.findById()不再支持回调的问题求助
Mongoose 7.x 回调错误修复方案
Mongoose 7.x版本开始彻底移除了对查询方法回调参数的支持,所有像findById、findOneAndUpdate这类方法现在只返回Promise,所以你原来传回调的写法会触发MongooseError: Model.findById() no longer accepts a callback错误。
下面是完整的修改后的代码,同时修复了代码中的拼写错误、替换了已废弃方法:
const UserModel = require("../models/user.model"); const ObjectID = require("mongoose").Types.ObjectId; module.exports.getAllUsers = async (req, res) => { const users = await UserModel.find().select("-password"); res.status(200).json(users); }; module.exports.userInfo = async (req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); try { const docs = await UserModel.findById(req.params.id).select("-password"); res.send(docs); } catch (err) { console.log("ID unknown : " + err); res.status(500).send({ message: err }); } }; module.exports.updateUser = async (req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); try { const docs = await UserModel.findOneAndUpdate( { _id: req.params.id }, { $set: { bio: req.body.bio } }, { new: true, upsert: true, setDefaultsOnInsert: true } ); res.send(docs); } catch (err) { return res.status(500).json({ message: err }); } }; module.exports.deleteUser = async (req, res) => { if (!ObjectID.isValid(req.params.id)) return res.status(400).send("ID unknown : " + req.params.id); try { await UserModel.findByIdAndDelete(req.params.id); res.status(200).json({ message: "Successfully deleted. " }); } catch (err) { return res.status(500).json({ message: err }); } }; module.exports.follow = async (req, res) => { if ( !ObjectID.isValid(req.params.id) || !ObjectID.isValid(req.body.idToFollow) ) return res.status(400).send("ID unknown : " + req.params.id); try { const currentUser = await UserModel.findByIdAndUpdate( req.params.id, { $addToSet: { following: req.body.idToFollow } }, { new: true, upsert: true } ); await UserModel.findByIdAndUpdate( req.body.idToFollow, { $addToSet: { followers: req.params.id } }, { new: true, upsert: true } ); res.status(201).json(currentUser); } catch (err) { return res.status(400).json({ message: err }); } }; module.exports.unfollow = async (req, res) => { if ( !ObjectID.isValid(req.params.id) || !ObjectID.isValid(req.body.idToUnfollow) ) return res.status(400).send("ID unknown : " + req.params.id); try { const currentUser = await UserModel.findByIdAndUpdate( req.params.id, { $pull: { following: req.body.idToUnfollow } }, { new: true, upsert: true } ); await UserModel.findByIdAndUpdate( req.body.idToUnfollow, { $pull: { followers: req.params.id } }, { new: true, upsert: true } ); res.status(201).json(currentUser); } catch (err) { return res.status(400).json({ message: err }); } };
关键修改点说明
- 移除所有回调参数:把
findById、findOneAndUpdate等方法的回调参数全部删除,改用async/await处理异步操作 - 统一错误处理:用
try/catch捕获所有异步操作的错误,保持代码风格一致 - 修复拼写错误:把代码中的
jsos改为正确的json - 替换废弃方法:将已废弃的
remove方法替换为更语义化的findByIdAndDelete
内容的提问来源于stack exchange,提问作者Nabil R.
相关产品推荐
相关产品推荐

