使用Node.js访问MongoDB的tutorial集合时返回undefined问题
问题原因及解决方案
核心问题是异步操作未完成就关闭MongoDB连接:
collection.find().toArray()是异步回调函数,它的执行会被放入事件循环的后续队列。你在调用这个方法后立刻执行client.close(),导致MongoDB连接在查询操作完成前就被强制关闭,回调函数里的data无法获取到有效数据,最终输出undefined。
修正方案1:将连接关闭操作放到查询回调内
把client.close()移到toArray的回调函数中,确保只有在查询完成(无论成功或失败)后才关闭连接:
const mongodb = require("mongodb"); const express = require("express"); var app = express(); var mongoClient = mongodb.MongoClient; var conn = "mongodb://localhost:27017"; mongoClient.connect(conn, (err, client) => { if (err) { console.log(err); return; } console.log("connection established"); var db = client.db("mydb"); var collection = db.collection("tutorial"); collection.find().toArray((err, data) => { if (err) { console.log(err); client.close(); return; } console.log(data); client.close(); // 查询完成后关闭连接 }); });
修正方案2:使用async/await简化异步逻辑(推荐)
现代Node.js更推荐用async/await处理异步操作,代码可读性更高,也更容易避免回调嵌套的问题:
const mongodb = require("mongodb"); const express = require("express"); var app = express(); var mongoClient = mongodb.MongoClient; var conn = "mongodb://localhost:27017"; async function fetchTutorialDocs() { let client; try { // 建立连接 client = await mongoClient.connect(conn); console.log("connection established"); // 获取数据库和集合 const db = client.db("mydb"); const collection = db.collection("tutorial"); // 查询所有文档并转为数组 const data = await collection.find().toArray(); console.log(data); } catch (err) { // 捕获所有错误 console.log(err); } finally { // 确保无论是否出错,连接都会被关闭 if (client) { await client.close(); } } } // 执行函数 fetchTutorialDocs();
额外排查点
如果修正后仍有问题,建议检查:
- MongoDB服务是否正常运行在
localhost:27017端口 mydb数据库是否存在,且tutorial集合内有实际文档- 当前执行代码的用户是否拥有访问该数据库和集合的权限
内容的提问来源于stack exchange,提问作者Bahy Mohamed
相关产品推荐
相关产品推荐

