如何解决Mongoose连接Node.js时的MongooseServerSelectionError(ECONNREFUSED ::1:27017)问题
从你的错误信息和操作记录来看,核心问题出在Node.js 17+默认优先使用IPv6解析localhost,而你的MongoDB服务可能没有监听IPv6地址,或者配置上只绑定了IPv4的127.0.0.1。下面是针对性的解决方案:
1. 强制使用IPv4地址连接
把你的连接字符串从mongodb://localhost:27017/db_name改成明确指定IPv4的地址:
const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/db_name', { useUnifiedTopology: true });
虽然你提到试过用127.0.0.1,但请确认代码里确实替换了localhost——Node.js 17+会把localhost优先解析为IPv6的::1,哪怕你写了localhost也会走这个地址,而你的MongoDB可能没在这个端口监听。
2. 调整MongoDB的绑定配置
打开MongoDB的配置文件(Windows下通常在C:\Program Files\MongoDB\Server\对应版本号\bin\mongod.cfg,Mac/Linux可能在/etc/mongod.conf),找到net部分:
net: port: 27017 bindIp: 127.0.0.1 # 确保这里包含IPv4地址,或者改成bindIpAll: true
如果设置bindIpAll: true,会允许MongoDB监听所有可用的IP地址(包括IPv4和IPv6),适合本地开发场景。修改后重启MongoDB服务,确保配置生效。
3. 验证MongoDB的监听状态
用命令检查MongoDB实际监听的端口:
- Windows:打开命令提示符,运行
netstat -ano | findstr :27017 - Mac/Linux:终端运行
lsof -i :27017
如果输出里只有::1:27017(IPv6)而没有0.0.0.0:27017或127.0.0.1:27017,说明MongoDB没监听IPv4,需要回到步骤2调整配置。
4. 让Node.js优先使用IPv4解析
如果不想修改连接字符串或MongoDB配置,可以在启动Node应用时添加参数强制IPv4优先:
node --dns-result-order=ipv4first index.js
或者在你的package.json里修改scripts,方便后续启动:
{ "scripts": { "start": "node --dns-result-order=ipv4first index.js", "test": "echo \"Error: no test specified\" && exit 1" } }
之后运行npm start即可用IPv4优先的方式启动应用。
这些方法应该能解决你遇到的连接拒绝问题,本质上是Node.js 17+的DNS解析规则变化导致的适配问题,调整其中一项就能正常连接MongoDB了。
内容的提问来源于stack exchange,提问作者Akash Kumar

