authSource必须显式指定以避免认证失败,tls=true为强制要求确保加密连接,生产环境需合理配置连接池并URL编码密码。

连接字符串必须包含 authSource 和 tls 参数
不加 authSource 会导致认证失败,哪怕用户名密码正确;不显式启用 tls(或 ssl)则无法建立加密通道,连接会直接被拒绝。
-
authSource通常设为admin,除非你把用户建在其他数据库里(比如myapp),那就得对应改成myapp -
tls=true是强制要求,MongoDB Atlas 默认只允许 TLS 连接;本地自建带 TLS 的集群也一样 - 若用自签名证书,需额外加
tlsCAFile=/path/to/ca.pem,否则 Node.js 会报MongoServerSelectionError: unable to verify the first certificate
MongoClient.connect() 的 options 里别漏掉 minPoolSize 和 maxPoolSize
默认连接池大小(minPoolSize=0, maxPoolSize=100)在高并发场景下容易成为瓶颈,尤其配合 TLS 握手时延迟明显升高。
- 生产环境建议设
minPoolSize: 5+maxPoolSize: 20,避免冷启动抖动 - 如果应用是短生命周期(如 Serverless),反而要设
minPoolSize: 0并手动调用client.close(),否则连接泄漏 - 别在每次请求都新建
MongoClient实例——这是最常见内存和连接数暴涨的根源
使用 mongosh 验证连接参数前,先检查 Node.js 版本是否支持 TLS 1.2+
Node.js v12.22.0 之前版本默认禁用 TLS 1.3,而部分云 MongoDB(如 Atlas 的新集群)已停用 TLS 1.2,导致 connect ECONNREFUSED 或静默超时。
- 运行
node -v,确认 ≥v14.0.0(推荐 ≥v18.17.0) - 验证命令:
mongosh "mongodb+srv://user:pass@cluster.xzy12.mongodb.net/?tls=true&authSource=admin" - 如果
mongosh能连通但 Node.js 不行,大概率是 Node.js TLS 配置或 DNS 解析问题,不是 MongoDB 设置问题
凭证不要硬编码,MONGODB_URI 环境变量必须 URL 编码特殊字符
密码含 +、/、@、: 时,未编码会导致解析错误,现象是 Authentication failed 或 Invalid hostname。
- 用
encodeURIComponent()处理密码(仅密码,不是整个 URI):例如密码pa@ss/w+rd→pa%40ss%2Fw%2Brd - 推荐构造方式:
mongodb+srv://user:${encodeURIComponent(password)}@cluster... - 本地开发可用
.env,但上线必须通过系统环境变量注入,避免泄露到构建产物中


















