Mongoose调用find方法报错cursor.toArray is not a function及MongoInvalidArgumentError
问题解决方法
错误原因
- 你所使用的mongoose 6.x及以上版本默认已经内置了
useNewUrlParser、useUnifiedTopology等连接配置,额外传入过时的连接参数会触发MongoInvalidArgumentError报错,同时版本不兼容会导致游标调用方法异常。 - 数据库连接是异步操作,你在连接未完全建立时就执行
find查询,会导致游标对象初始化异常,触发cursor.toArray is not a function报错。
修复步骤
1. 修正连接配置
移除mongoose.connect中额外的配置参数,修改为:
const mongoose = require('mongoose') // mongoose 6.x及以上版本无需传入额外连接参数 await mongoose.connect('mongodb://localhost:27017/fruitsDB')
如果需要用回调写法监听连接结果:
mongoose.connect('mongodb://localhost:27017/fruitsDB') .then(() => console.log('数据库连接成功')) .catch(err => console.log('连接失败:', err))
2. 调整代码时序,保证所有数据库操作在连接就绪后执行
推荐使用async/await写法优化异步逻辑,完整可运行代码如下:
const mongoose = require('mongoose') const fruitSchema = new mongoose.Schema({ name: String, price: Number }) const Fruit = mongoose.model('Fruit', fruitSchema) async function run() { // 先建立连接 await mongoose.connect('mongodb://localhost:27017/fruitsDB') // 插入数据 const banana = new Fruit({ name: "Banana", price: 40 }) const apple = new Fruit({ name: "Apple", price: 30 }) await banana.save() await apple.save() // 查询数据 const docs = await Fruit.find() console.log(docs) // 操作完成后可关闭连接 await mongoose.connection.close() } run().catch(err => console.log('操作出错:', err))
3. 若依然报错,修复依赖版本冲突
删除项目下的node_modules文件夹和package-lock.json文件,执行以下命令安装兼容的依赖版本:npm install mongoose@7.x mongodb@5.x
内容的提问来源于stack exchange,提问作者Sandeep Singh
相关产品推荐
相关产品推荐

