通过SSH隧道用Mongoose/NestJS连接MongoDB SRV字符串遇阻求助
通过SSH隧道连MongoDB Atlas集群失败?看这解决办法
先说说为啥你的连接会失败:
- 你用的
mongodb+srv://localhost完全没用,SRV是用来解析Atlas集群节点的,localhost根本没有对应的SRV记录,解析不出任何节点信息。 - 就算用了非SRV的字符串,Atlas集群是多节点的,你的SSH隧道只转发了单个节点,Mongoose默认会尝试连接集群里的所有节点,没被转发的节点连不上,自然失败。
第一步:修正SSH隧道命令
从Atlas控制台的连接信息里拿一个具体的节点地址(比如cluster0-shard-00-00.acsacasc.mongodb.net),把隧道转发到这个节点:
ssh -N -L 27017:cluster0-shard-00-00.acsacasc.mongodb.net:27017 -i /Users/cvrg/.ssh/id_rsa ubuntu@2.1.5.2
第二步:用正确的Mongoose连接字符串
别用SRV格式了,直接用标准连接字符串,必须加上ssl=true和authSource=admin(Atlas要求用admin库做身份验证):
// NestJS/Mongoose用这个连接字符串 mongodb://cd-cdd:cadcdacaca@localhost:27017/dev?ssl=true&authSource=admin&retryWrites=true&w=majority
第三步:强制Mongoose只连隧道节点
在Mongoose的配置里加directConnection: true,让它别去解析集群里的其他节点,只连你隧道转发的localhost:27017:
// NestJS里的配置示例 MongooseModule.forRoot('上面的连接字符串', { directConnection: true, })
为啥Compass能连?
Compass要么是自动处理了集群节点的转发逻辑,要么你在Compass里用的是直接指定单个节点的连接配置,和NodeJS/Mongoose的默认行为不一样。
先验证隧道是否正常
先别碰代码,用mongosh测试隧道能不能通:
mongosh "mongodb://localhost:27017/dev" --username cd-cdd --password cadcdacaca --ssl --authSource admin
如果这个命令能连上,再去调Mongoose的配置,肯定能解决。
内容的提问来源于stack exchange,提问作者Raghu Chahar
相关产品推荐
相关产品推荐

