Await函数无法与MongoDB集合协同工作的问题排查
解决MongoDB无法捕获集合数据的问题
你的代码存在三个核心问题,导致displayUsers输出undefined:
fetchUsers没有返回Promise,await无法等待其异步操作完成mongoose.connect是异步操作,你直接调用后未等待连接成功就执行查询,可能查询时连接还未建立Users.find使用回调函数写法,无法将查询结果作为函数返回值传递
以下是修正后的代码:
1. 修正fetchUsers.js
const mongoose = require('mongoose'); const uri = "mongodb+srv://<username>:<password>@<cluster-url>.sdzp0ug.mongodb.net/?retryWrites=true&w=majority"; // 改为async函数,支持内部使用await const fetchUsers = async () => { const connectionParams = { useNewUrlParser: true, useUnifiedTopology: true, }; try { // 等待数据库连接建立完成 await mongoose.connect(uri, connectionParams); console.log('数据库连接成功'); } catch (error) { console.error('数据库连接失败:', error); // 抛出错误让调用方处理 throw error; } const collectionName = 'UsersTests'; const Users = mongoose.model(collectionName, new mongoose.Schema({})); try { // 用await获取查询结果(Mongoose的find方法支持Promise) const docs = await Users.find({}); console.log(`Documents in ${collectionName}:`, docs); // 服务器运行时无需每次查询都关闭连接,建议在服务器停止时统一断开 // mongoose.connection.close(); return docs; } catch (err) { console.error('查询数据失败:', err); throw err; } }; module.exports = fetchUsers;
2. 修正displayUsers.js
const fetchData = require("../../controllers/USersControllers/fetchUsers.js"); async function displayUsers() { try { let users = await fetchData(); console.log('获取到的用户数据:', users); } catch (err) { console.error('获取用户数据失败:', err); } } module.exports = displayUsers;
3. 修正服务器代码(端口号不一致问题)
const express = require("express"); const displayUsers = require("./public/js/displayUsers.js"); const app = express(); app.use(express.static("public")); app.use(express.urlencoded({ extended: true })); const PORT = 5000; app.listen(PORT, () => { console.log(`Server started on port ${PORT}`); displayUsers(); });
额外说明
- 数据库连接不需要每次查询后关闭,保持长连接更高效,可通过
process.on('SIGINT', () => mongoose.connection.close())在服务器停止时统一关闭连接 - 定义Schema时建议明确字段结构,避免使用空Schema,这样Mongoose能更好地校验和处理数据
内容的提问来源于stack exchange,提问作者Niforius 220
相关产品推荐
相关产品推荐

