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

Node.js连接MongoDB后查询返回空数组,请求技术支持

Node.js + Express 连接MongoDB后无法读取集合数据问题排查

问题描述

使用Node.js结合Express框架连接MongoDB Atlas成功,但调用db.collection('items').find().toArray()时返回空数组,数据库已确认连接,但无法获取数据。

原始连接代码

let mongodb = require('mongodb').MongoClient;
let express = require("express")
let app = express()
let connectionString = 'mongodb://ToDoAppUser:ToDoAppUserPassword@ac-u9kgapm-shard-00-00.8rdkdoi.mongodb.net:27017,ac-u9kgapm-shard-00-01.8rdkdoi.mongodb.net:27017,ac-u9kgapm-shard-00-02.8rdkdoi.mongodb.net:27017/?ssl=true&replicaSet=atlas-68qno6-shard-0&authSource=admin&retryWrites=true&w=majority'
let db 
mongodb.connect(connectionString,function(err,client){
 
  if (err) throw err
   db = client.db()
   app.listen(3000)
   console.log("Database connected.");

})

app.use(express.urlencoded({extended : false}))

数据查询代码

app.get("/", function(req, res){
  // this collection method of mongodb returns empty array.
  // however, mongodb got connected, but i cannot retrieve data from mongodb  
  db.collection('items').find().toArray(function(err, items) {
    if(err) console.log(err)
    console.log(items)
  })

排查与解决方案

1. 确认数据库与集合名称正确性

  • client.db()未传入参数时,会默认使用连接字符串中指定的数据库,或MongoDB默认的test数据库。若你的items集合不在默认库中,需明确指定数据库名称:
    db = client.db('your_target_database_name'); // 替换为实际数据库名
    
  • 登录MongoDB Atlas控制台,进入目标集群,查看Collections标签页,确认items集合存在于指定数据库中。

2. 检查集合内是否存在数据

  • 在Atlas控制台中直接查看items集合,确认集合内有文档数据。若集合为空,查询自然返回空数组。

3. 验证数据库用户权限

  • 进入Atlas的Database Access页面,检查ToDoAppUser用户的权限配置:需确保该用户对目标数据库拥有read或readWrite权限。若无读取权限,查询会返回空结果或报错。

4. 优化连接逻辑,避免请求提前触发

  • 原始代码中,路由在数据库连接完成前就已注册,若在连接完成前访问/路由,db变量可能未初始化。推荐将路由注册与服务启动逻辑放在连接成功回调内,或使用async/await确保连接完成后再处理请求:

修改后的完整代码(使用async/await)

const { MongoClient } = require('mongodb');
const express = require('express');
const app = express();

const connectionString = 'mongodb://ToDoAppUser:ToDoAppUserPassword@ac-u9kgapm-shard-00-00.8rdkdoi.mongodb.net:27017,ac-u9kgapm-shard-00-01.8rdkdoi.mongodb.net:27017,ac-u9kgapm-shard-00-02.8rdkdoi.mongodb.net:27017/?ssl=true&replicaSet=atlas-68qno6-shard-0&authSource=admin&retryWrites=true&w=majority';
let db;

async function connectDB() {
  try {
    const client = await MongoClient.connect(connectionString);
    // 明确指定目标数据库名称
    db = client.db('your_target_database_name');
    console.log('Database connected successfully.');

    // 连接成功后再配置中间件与路由
    app.use(express.urlencoded({ extended: false }));

    app.get('/', async (req, res) => {
      try {
        const items = await db.collection('items').find().toArray();
        console.log('Retrieved items:', items);
        res.status(200).json(items); // 将数据返回前端便于验证
      } catch (err) {
        console.error('Error fetching items:', err);
        res.status(500).send('Failed to retrieve items');
      }
    });

    app.listen(3000, () => {
      console.log('Server running on port 3000');
    });
  } catch (err) {
    console.error('Database connection failed:', err);
    process.exit(1); // 连接失败时退出进程
  }
}

connectDB();

5. 排查网络与集群状态

  • 确认服务器网络可正常访问MongoDB Atlas集群,可通过ping ac-u9kgapm-shard-00-00.8rdkdoi.mongodb.net测试连通性。
  • 在Atlas控制台查看集群状态,确保所有节点处于正常运行状态。

内容的提问来源于stack exchange,提问作者Muhammad Junaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:45:51