使用Mongoose执行find查询报错cursor.toArray is not a function如何解决
问题原因
- 核心原因是
mongoose.connect为异步操作,你没有等待数据库连接完成就直接执行Note.find查询,此时数据库连接上下文未就绪,导致查询返回的游标对象异常,触发cursor.toArray is not a function报错。 - 连接配置缺少高版本Mongoose要求的必填参数,且所有异步操作都没有添加错误捕获逻辑,导致出现未处理的Promise拒绝警告。
- 若你使用的是Mongoose 6.x以上版本,旧的回调写法存在部分兼容问题,优先使用Promise/async await写法。
- 连接URL中的
<password>为占位符,未替换为MongoDB Atlas的实际账号密码也会导致连接失败。
修复方案
你可以直接使用以下修正后的代码:
const mongoose = require("mongoose"); // 把url中的占位符替换为你自己的MongoDB Atlas实际密码 const url = "mongodb+srv://Saif:替换为实际密码@cluster0.8d2lb.mongodb.net/notes-app?retryWrites=true&w=majority"; // 补充完整连接参数,等待连接成功后再执行查询 mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }) .then(() => { console.log("数据库连接成功"); // 连接成功后再执行查询逻辑 const noteSchema = new mongoose.Schema({ content: String, date: Date, important: Boolean, }); const Note = mongoose.model("Note", noteSchema); return Note.find({}); }) .then((result) => { result.forEach((note) => { console.log(note); }); mongoose.connection.close(); }) .catch(err => { // 统一捕获所有错误:连接错误、查询错误都在这里处理 console.log("操作失败:", err); mongoose.connection.close(); });
如果需要使用回调写法,也要把查询逻辑放到连接成功的回调中:
const mongoose = require("mongoose"); const url = "mongodb+srv://Saif:替换为实际密码@cluster0.8d2lb.mongodb.net/notes-app?retryWrites=true&w=majority"; mongoose.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err) => { if (err) { console.log("连接失败:", err); return; } const noteSchema = new mongoose.Schema({ content: String, date: Date, important: Boolean, }); const Note = mongoose.model("Note", noteSchema); Note.find({}, (error, data) => { if (error) { console.log("查询失败:", error); } else { data.forEach((note) => { console.log(note); }) } mongoose.connection.close() }) })
内容的提问来源于stack exchange,提问作者Saif eldeen Adel
相关产品推荐
相关产品推荐

