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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:52:25