如何解决MongooseServerSelectionError: connect ECONNREFUSED ::1:27017错误?
问题描述
尝试将连接地址从localhost改为127.0.0.1、0.0.0.0均无效,已添加family: 4配置及{ useNewUrlParser: true, useUnifiedTopology: true }参数,仍出现连接超时或拒绝错误,错误详情如下:
G:\Coding Acadamy\js\MongoD\node_modules\mongoose\lib\connection.js:791 err = new ServerSelectionError(); ^ MongooseServerSelectionError: connect ECONNREFUSED ::1:27017 at _handleConnectionErrors (G:\Coding Acadamy\js\MongoD\node_modules\mongoose\lib\connection.js:791:11) at NativeConnection.openUri (G:\Coding Acadamy\js\MongoD\node_modules\mongoose\lib\connection.js:766:11) { reason: TopologyDescription { type: 'Unknown', servers: Map(1) { 'localhost:27017' => ServerDescription { address: 'localhost:27017', type: 'Unknown', hosts: [], passives: [], arbiters: [], tags: {}, minWireVersion: 0, maxWireVersion: 0, roundTripTime: -1, lastUpdateTime: 1952326, lastWriteDate: 0, error: MongoNetworkError: connect ECONNREFUSED ::1:27017 at connectionFailureError (G:\Coding Acadamy\js\MongoD\node_modules\mongoose\node_modules\mongodb\lib\cmap\connect.js:370:20) at Socket.<anonymous> (G:\Coding Acadamy\js\MongoD\node_modules\mongoose\node_modules\mongodb\lib\cmap\connect.js:293:22) at Object.onceWrapper (node:events:628:26) at Socket.emit (node:events:513: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: connect ECONNREFUSED ::1:27017 at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1494:16) { errno: -4078, code: 'ECONNREFUSED', syscall: 'connect', address: '::1', port: 27017 }, [Symbol(errorLabels)]: Set(1) { 'ResetPool' } }, topologyVersion: null, setName: null, setVersion: null, electionId: null, logicalSessionTimeoutMinutes: null, primary: null, me: null, '$clusterTime': null } }, stale: false, compatible: true, heartbeatFrequencyMS: 10000, localThresholdMS: 15, setName: null, maxElectionId: null, maxSetVersion: null, commonWireVersion: 0, logicalSessionTimeoutMinutes: null }, code: undefined } Node.js v18.16.0
解决步骤
确认MongoDB服务正在运行
Windows:打开服务管理器(services.msc),找到MongoDB服务,确保状态为“正在运行”,未启动则手动启动。
macOS/Linux:执行ps aux | grep mongod查看进程,无进程则执行mongod启动服务(或用系统服务命令如systemctl start mongod)。修改MongoDB配置强制绑定IPv4
找到MongoDB配置文件(Windows通常为C:\Program Files\MongoDB\Server\版本号\bin\mongod.cfg,Linux/macOS为/etc/mongod.conf),修改net部分:net: port: 27017 bindIp: 127.0.0.1 # 替换原有的localhost或0.0.0.0,仅绑定IPv4地址修改后重启MongoDB服务。
确保连接配置正确传入
family: 4
检查代码中连接字符串和配置的位置,确保family:4在options对象内,示例:const mongoose = require('mongoose'); mongoose.connect('mongodb://127.0.0.1:27017/your_database_name', { useNewUrlParser: true, useUnifiedTopology: true, family: 4 // 强制使用IPv4,避免解析到IPv6的::1 }) .then(() => console.log('MongoDB连接成功')) .catch(err => console.error('连接失败:', err));修改系统hosts文件,限制localhost解析为IPv4
Windows:打开C:\Windows\System32\drivers\etc\hosts(需管理员权限),注释掉::1 localhost这一行,确保只有127.0.0.1 localhost的映射。
macOS/Linux:打开/etc/hosts,同样注释::1 localhost,保留127.0.0.1 localhost。临时禁用IPv6测试(可选)
如果以上步骤无效,可临时禁用系统IPv6功能,再次尝试连接,确认是否为IPv6解析导致的问题。
内容的提问来源于stack exchange,提问作者soldour

