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

Mongoose报错:Model.find()不再支持回调函数,求解决方法

解决Mongoose中Model.find()不再接受回调的错误

错误信息

throw new MongooseError('Model.find() no longer accepts a callback');
^

MongooseError: Model.find() no longer accepts a callback
    at Function.find (D:\programming\programs\.vscode\FruitsProject\node_modules\mongoose\lib\model.js:2081:11)
    at Object.<anonymous> (D:\programming\programs\.vscode\FruitsProject\mongoose.js:37:7)
    at Module._compile (node:internal/modules/cjs/loader:1256:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
    at Module.load (node:internal/modules/cjs/loader:1119:32)
    at Module._load (node:internal/modules/cjs/loader:960:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js版本:v18.16.1

用户提供的代码(已采用async/await):

const mongoose = require("mongoose");

mongoose.connect("mongodb://127.0.0.1:27017/fruitsDB", { useNewUrlParser: true });

const fruitSchema = new mongoose.Schema({

    name: {
        type: String,
        required: [true, "Please check your data entry, no name specified!"]
    },
    rating: {
        type: Number,
        min: 1,
        max: 6
    },
    review: String
});

const Fruit = mongoose.model("Fruit", fruitSchema);

const personSchema = new mongoose.Schema({
    name: String,
    age: Number
});

const Person = mongoose.model("Person", personSchema);

async function saveFruitAndPerson() {
    try {
        // 创建并保存Fruit文档
        const fruit = new Fruit({
            name: "Grapes",
            rating: 6,
            review: "Grape is a good fruit"
        });
        const savedFruit = await fruit.save();
        console.log("Saved fruit:", savedFruit);

        // 创建并保存Person文档
        const person = new Person({
            name: "John",
            age: 37
        });
        const savedPerson = await person.save();
        console.log("Saved person:", savedPerson);

        // 使用findOne查询Fruit文档
        const retrievedFruit = await Fruit.findOne({ name: "Grapes" });
        console.log("Retrieved fruit:", retrievedFruit);

        // 使用findOne查询Person文档
        const retrievedPerson = await Person.findOne({ name: "John" });
        console.log("Retrieved person:", retrievedPerson);
    } catch (error) {
        console.error("Error:", error);
    } finally {
        mongoose.connection.close(); // 关闭数据库连接
    }
}

saveFruitAndPerson();

问题分析与解决方法

从错误栈看,问题出在mongoose.js第37行——调用Model.find()时传入了回调函数,但你提供的代码里并没有使用find()方法,只用到了findOne()。这说明当前运行的代码和你贴出的代码不一致,或者存在缓存残留问题。

解决步骤:

  1. 检查运行文件的实际内容:打开正在运行的mongoose.js,定位到第37行,确认是否存在类似Fruit.find({}, (err, fruits) => { ... })的代码——这种带回调的写法在Mongoose v7+版本中已被彻底移除。
  2. 修正find()写法:如果确实存在带回调的find(),改成async/await形式:
    // 错误写法
    Fruit.find({}, (err, fruits) => {
      if (err) console.log(err);
      else console.log(fruits);
    });
    
    // 正确async/await写法
    const fruits = await Fruit.find({});
    console.log(fruits);
    
  3. 清理缓存并重启环境:Node.js可能缓存了旧代码,导致修改后的代码未生效。可以直接重启VS Code或终端,或者删除项目中的node_modules/.cache目录(如果存在)。
  4. 确认Mongoose版本:Mongoose v7及以上版本完全移除了对回调的支持,所有查询操作必须使用Promise、async/await或.then()链式调用。确保项目依赖的Mongoose版本与代码写法匹配。

内容的提问来源于stack exchange,提问作者Arun vel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 17:15:38