You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 });
  }
};

关键修改点说明

  1. 移除所有回调参数:把findById、findOneAndUpdate等方法的回调参数全部删除,改用async/await处理异步操作
  2. 统一错误处理:用try/catch捕获所有异步操作的错误,保持代码风格一致
  3. 修复拼写错误:把代码中的jsos改为正确的json
  4. 替换废弃方法:将已废弃的remove方法替换为更语义化的findByIdAndDelete

内容的提问来源于stack exchange,提问作者Nabil R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:24:56