You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:15:36