MongoDB Atlas执行.find()查询返回空对象问题求助
问题根因
查询返回空不是数据不存在,是代码存在几处明显错误:
- 最核心的问题:路由里的
.toArray()是异步返回Promise的方法,你没加await等待查询完成,直接把未完成的Promise对象发给前端,自然拿不到实际数据。 - 数据库连接逻辑冗余错误:
MongoClient.connect()本身就已经完成连接建立,你后面又写了一行await dba.connect()重复调用连接方法,属于无效逻辑,极端情况还会触发连接报错。 - 环境变量默认值写法错误:
const { PORT, URI } = process.env || 5000;这行的兜底完全不生效,Node正常运行时process.env对象必然存在,不会走后面的5000兜底,就算走了兜底,解构出来的PORT和URI还是undefined。 - 额外排查点:MongoDB对库名、集合名大小写敏感,你代码里写的库名是
Auth、集合名是Users,要和Atlas控制台里实际的命名完全一致,差一个大小写都会查不到数据。
修复后代码
服务端入口文件修正
require("dotenv").config({ path: "./config.env" }); const { MongoClient, ServerApiVersion } = require("mongodb"); const express = require("express"); const { ServiceBroker } = require("moleculer"); const AUTH_SERVICE = require("./controller/services/auth/auth.service"); global.broker = new ServiceBroker({ nodeID: "auth", }); const app = express(); app.use(express.json()); app.use("/auth", require("./routes/auth")); // 修正环境变量默认值写法 const PORT = process.env.PORT || 5000; const URI = process.env.URI; global.broker.createService(AUTH_SERVICE); const start = async () => { const dba = await MongoClient.connect(URI, { useNewUrlParser: true, useUnifiedTopology: true, }); global.db = dba.db("Auth"); console.log("DATABASE CONNESSO CON SUCCESSO📡"); await global.broker.start(); app.listen(PORT, () => console.log(`PORT IT'S UP AND RUNNING 🚀 ON ${PORT}`)); }; start();
说明:删掉了重复的dba.connect()调用,修正了环境变量的默认值赋值逻辑
路由文件修正
const express = require("express"); const router = express.Router(); router.get("/register", async (req, res) => { // 给异步查询加await,等待结果返回再响应 const data = await global.db.collection("Users").find({}).toArray(); res.send(data); }); module.exports = router;
说明:给.toArray()加了await关键字,确保查询完成拿到数组结果后再返回给前端,后续可以自行加try/catch做错误捕获,避免查询报错时服务直接挂掉
改完重启服务再调用接口,就能正常查到已存储的用户数据。
内容的提问来源于stack exchange,提问作者giovanni caiazzo
相关产品推荐
相关产品推荐

