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

连接MongoDB Atlas时出现ERR_SOCKET_CONNECTION_TIMEOUT错误求助

解决Node.js连接MongoDB Atlas时的ERR_SOCKET_CONNECTION_TIMEOUT错误

问题场景

在Node.js项目中连接MongoDB Atlas数据库时,触发MongoNetworkError: Socket connection timeout错误,错误日志如下:

return new error_1.MongoNetworkError(err);
                   ^

MongoNetworkError: Socket connection timeout
    at connectionFailureError (D:\MERN\Project\social-media-api\node_modules\mongodb\lib\cmap\connect.js:370:20)
    at TLSSocket.<anonymous> (D:\MERN\Project\social-media-api\node_modules\mongodb\lib\cmap\connect.js:293:22)
    at Object.onceWrapper (node:events:626:26)
    at TLSSocket.emit (node:events:511:28)
    at emitErrorNT (node:internal/streams/destroy:151:8)
    at emitErrorCloseNT (node:internal/streams/destroy:116:3)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
  cause: Error [ERR_SOCKET_CONNECTION_TIMEOUT]: Socket connection timeout
      at new NodeError (node:internal/errors:399:5)
      at internalConnectMultiple (node:net:1099:20)
      at Timeout.internalConnectMultipleTimeout (node:net:1638:3)
      at listOnTimeout (node:internal/timers:575:11)
      at process.processTimers (node:internal/timers:514:7) {
    code: 'ERR_SOCKET_CONNECTION_TIMEOUT'
  },
  connectionGeneration: 18,
  [Symbol(errorLabels)]: Set(1) { 'ResetPool' }
}

Node.js v20.1.0
[nodemon] app crashed - waiting for file changes before starting...

使用的连接字符串:

MONGODB_URL = "mongodb+srv://<username here>:<password here>@clustername.bwmogva.mongodb.net/<database name>?retryWrites=true&w=majority"

已尝试调整socketTimeoutMS参数、开放Atlas网络权限,但问题仍存在,且MongoDB Compass可正常连接。


解决方案

  • 转义连接字符串中的特殊字符
    如果数据库密码包含@、:、/、%等URL特殊字符,必须进行URL编码。可以通过encodeURIComponent()工具处理,例如:

    const encodedPassword = encodeURIComponent('你的密码');
    const MONGODB_URL = `mongodb+srv://用户名:${encodedPassword}@clustername.bwmogva.mongodb.net/数据库名?retryWrites=true&w=majority`;
    

    手动替换的话,常见特殊字符对应编码:@→%40,:→%3A,/→%2F。

  • 完善连接配置参数
    除socketTimeoutMS外,需补充设置连接超时和服务器选择超时参数,确保客户端有足够时间建立连接:

    const mongoose = require('mongoose'); // 若使用Mongoose
    // 或使用MongoDB原生驱动
    const { MongoClient } = require('mongodb');
    
    // Mongoose示例
    mongoose.connect(process.env.MONGODB_URL, {
      connectTimeoutMS: 30000, // 连接超时时间
      socketTimeoutMS: 45000, // 套接字超时时间
      serverSelectionTimeoutMS: 30000 // 服务器选择超时时间
    });
    
    // 原生驱动示例
    const client = new MongoClient(process.env.MONGODB_URL, {
      connectTimeoutMS: 30000,
      socketTimeoutMS: 45000,
      serverSelectionTimeoutMS: 30000
    });
    
  • 排查Node.js环境的网络限制

    • 若服务器在代理环境下运行,需配置代理:
      const { MongoClient } = require('mongodb');
      const HttpsProxyAgent = require('https-proxy-agent');
      
      const agent = new HttpsProxyAgent('http://你的代理地址:端口');
      const client = new MongoClient(process.env.MONGODB_URL, { proxyAgent: agent });
      
    • 检查系统防火墙、杀毒软件是否拦截Node.js的网络请求,临时关闭测试是否恢复连接。
  • 重新生成Atlas连接字符串
    登录MongoDB Atlas控制台,进入集群的「Connect」页面,重新生成SRV格式的连接字符串,确保集群状态为「Available」,避免因集群配置变更导致旧连接字符串失效。

  • 检查依赖版本兼容性
    Node.js v20.1.0需搭配兼容的MongoDB驱动/Mongoose版本,建议升级到最新稳定版:

    # 升级Mongoose
    npm install mongoose@latest
    # 或升级MongoDB原生驱动
    npm install mongodb@latest
    

内容的提问来源于stack exchange,提问作者Unnikrishnan KJ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 11:58:36