MERN Stack项目中toArray函数失效,查询返回空列表求助
问题排查与解决方案
以下是导致你获取food_items集合数据为空的常见原因及对应解决步骤:
1. 数据库/集合名称不匹配
- 你的MongoDB连接URI中没有指定目标数据库,Mongoose会默认使用
test数据库。请确认:- Atlas控制台中,你的
food_items集合是否存在于test数据库下? - 如果集合在其他数据库(比如
foodDB),修改连接URI,在末尾添加数据库名:const mongoURI = 'mongodb://<username>:<password>@ac-czejupk-shard-00-00.e8wdets.mongodb.net:27017/foodDB?ssl=true&replicaSet=atlas-11o3y9-shard-0&authSource=admin&retryWrites=true&w=majority' - 或者在
mongoose.connect中通过dbName选项指定:await mongoose.connect(mongoURI, { useNewUrlParser: true, dbName: "foodDB" })
- Atlas控制台中,你的
2. 异步代码混用回调与async/await导致的问题
你的代码同时混用了await和回调函数,可能引发异步执行顺序问题。建议统一使用async/await写法,避免嵌套回调:
const mongoose = require('mongoose'); const mongoURI = 'mongodb://<username>:<password>@ac-czejupk-shard-00-00.e8wdets.mongodb.net:27017/foodDB?ssl=true&replicaSet=atlas-11o3y9-shard-0&authSource=admin&retryWrites=true&w=majority' const mongoDB = async () => { try { await mongoose.connect(mongoURI, { useNewUrlParser: true, dbName: "foodDB" }); console.log("connected"); const db = mongoose.connection.db; const fetched_data = db.collection("food_items"); const data = await fetched_data.find({}).toArray(); global.food_items = data; console.log(global.food_items); } catch (err) { console.log("---", err); } } module.exports = mongoDB;
3. 数据库用户权限不足
- 登录MongoDB Atlas控制台,进入Database Access页面,检查你的数据库用户是否拥有
read或readWrite权限。 - 如果用户仅具备
read权限,确认集合是否允许读取;如果权限不够,修改用户角色为readWrite。
4. 集合本身无数据
- 直接在Atlas控制台的Collections页面查看
food_items集合,确认其中是否存在文档。如果集合为空,自然返回空数组。
5. 依赖版本冲突
你的package.json中同时安装了mongodb@2.2.12(旧版本)和mongoose@6.6.1,两者的驱动可能存在兼容性问题:
- 卸载
mongodb和mongodb-legacy,因为Mongoose自带MongoDB驱动,无需单独安装:npm uninstall mongodb mongodb-legacy - 确保Mongoose版本与Node.js版本兼容(Mongoose 6.x支持Node.js 12.0.0+)。
内容的提问来源于stack exchange,提问作者Apurva Muthaye
相关产品推荐
相关产品推荐

