MongoDB+Node.js中collection.find({}).toArray()无返回,报连接超时
Node.js 集成 MongoDB 异常排查:
find({}).toArray() 超时,其他操作正常 问题现象
执行 collection.find({}).toArray() 时抛出 MongoNetworkError: Socket connection timeout 错误,无法返回结果;但带查询条件的 findOne、insertOne 等操作均能正常运行。
相关代码
require("dotenv").config(); const express = require("express"); const router = express.Router(); const tokenValidation = require("../tokenValidation"); const { MongoClient } = require("mongodb"); const ObjectId = require("mongodb").ObjectId; const client = new MongoClient(process.env.DB_CONNECT); const posts = client.db("TestDb").collection("posts"); router.get("/", tokenValidation.authToken, async (req, res) => { const test = await posts.find({}).toArray(); console.log(test); res.json(test).send(); });
错误详情
error: MongoNetworkError: Socket connection timeout
Doesn't return anything, if i use findOne with a query, insertOne, everything works
可能的原因与解决办法
1. 未确保MongoDB客户端完成连接
当前代码直接初始化客户端后就获取集合,虽新版客户端支持懒连接,但全量查询时可能因连接未完全建立触发超时。需手动显式完成连接:
require("dotenv").config(); const express = require("express"); const router = express.Router(); const tokenValidation = require("../tokenValidation"); const { MongoClient } = require("mongodb"); const ObjectId = require("mongodb").ObjectId; let posts; // 初始化数据库连接 async function initDB() { const client = new MongoClient(process.env.DB_CONNECT); await client.connect(); const db = client.db("TestDb"); posts = db.collection("posts"); console.log("MongoDB 连接成功"); } // 启动时执行连接 initDB().catch(err => console.error("数据库连接失败:", err)); router.get("/", tokenValidation.authToken, async (req, res) => { if (!posts) { return res.status(500).json({ error: "数据库未连接" }); } const test = await posts.find({}).toArray(); console.log(test); res.json(test); });
2. 集合数据量过大触发超时
find({}) 查询全量数据,若集合数据量过大,传输与处理时间过长会触发超时。可先分页调试,或延长超时配置:
- 分页调试(先查询前10条):
const test = await posts.find({}).limit(10).toArray();
- 延长客户端超时参数:
const client = new MongoClient(process.env.DB_CONNECT, { serverSelectionTimeoutMS: 30000, // 服务器选择超时延长至30秒 socketTimeoutMS: 45000 // Socket超时延长至45秒 });
3. 连接池配置不足
全量查询会占用更多连接资源,默认连接池过小可能导致请求排队超时,可调整连接池大小:
const client = new MongoClient(process.env.DB_CONNECT, { maxPoolSize: 20 // 根据服务器资源调整,可适当增大 });
4. 网络或MongoDB服务器配置问题
检查MongoDB服务器防火墙,确保允许应用服务器IP访问;查看MongoDB日志,确认是否存在慢查询、连接拒绝等记录。
内容的提问来源于stack exchange,提问作者CatalinPCE
相关产品推荐
相关产品推荐

