连接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
相关产品推荐
相关产品推荐

