mongoose执行model.find报参数错误 无法打印模型属性如何解决
Mongoose find方法报错修复方案
错误原因
- 核心触发原因是
mongoose.connect为异步操作,你没有等待数据库连接完成就直接执行了save、find等数据库操作,对应版本Mongoose的操作队列逻辑在连接未就绪时调用find会出现参数传递异常,触发collection.find() 最多接受两个参数的报错。 - 所有异步操作没有做错误捕获,因此出现未处理Promise拒绝的警告。
fruit.save()也是异步操作,调用后立刻执行find可能出现数据还未写入完成的情况,导致查询不到刚插入的苹果数据。
修复后代码
const mongoose = require("mongoose"); console.log("Starting..."); // 提前定义Schema和Model,无需等待连接 const fruitSchema = new mongoose.Schema({ name: String, rating: Number, review: String }); const Fruit = mongoose.model("Fruit", fruitSchema); // 等待连接成功后再执行所有数据库操作 mongoose.connect("mongodb://localhost:27017/fruitsDB", {useNewUrlParser: true}) .then(async () => { // 写入数据,等待save操作完成 const fruit = new Fruit ({ name: "Apple", rating: 7, review: "Pretty solid as a fruit." }); await fruit.save(); // 执行查询 const fruits = await Fruit.find({}); console.log(fruits); fruits.forEach(fruit => { console.log(fruit.name); }); // 操作完成后关闭连接 mongoose.connection.close(); }) .catch(err => { // 统一捕获所有异步错误 console.log("操作出错:", err); mongoose.connection.close(); });
补充说明
如果你习惯使用回调写法,只需要把所有数据库操作放到mongoose.connect的回调函数中,确保连接就绪后再执行即可解决报错。
如果你使用的是Mongoose 6.x及以上版本,connect方法不需要额外传入useNewUrlParser参数,框架默认已开启该配置。
内容的提问来源于stack exchange,提问作者421
相关产品推荐
相关产品推荐

