Node.js连接MongoDB失败求助:ECONNREFUSED报错排查
Node.js连接MongoDB报错(MongoServerSelectionError: connect ECONNREFUSED ::1:27017)解决方法
环境信息
- MongoDB版本:6.5.0(以服务形式完整安装)
- 已安装mongosh,可通过mongosh正常访问、修改数据库
- Node.js版本:18.15.0
- 项目操作:执行
npm init初始化项目,安装mongodb驱动(额外执行了npm install node,该操作无必要)
问题代码
用户的connect.js代码:
const {MongoClient} = require('mongodb'); const MONGO_URL = 'mongodb://localhost:27017'; const DB_NAME = 'tododb'; // ASYNC IIFE (async () =>{ const client = await MongoClient.connect(MONGO_URL) const tododb = client.db(DB_NAME) console.log(tododb) })()
报错信息
执行node connect.js时出现如下报错:
C:\Users\Gaurav\Desktop\Gagan\DEV\mongoBasics\node_modules\mongodb\lib\sdam\topology.js:277 const timeoutError = new error_1.MongoServerSelectionError(`Server selection timed out after ${serverSelectionTimeoutMS} ms`, this.description); ^ MongoServerSelectionError: connect ECONNREFUSED ::1:27017 at Timeout._onTimeout (C:\Users\Gaurav\Desktop\Gagan\DEV\mongoBasics\node_modules\mongodb\lib\sdam\topology.js:277:38) at listOnTimeout (node:internal/timers:569:17) at process.processTimers (node:internal/timers:512:7) { 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: 1431144101, lastWriteDate: 0, error: MongoNetworkError: connect ECONNREFUSED ::1:27017 at connectionFailureError (C:\Users\Gaurav\Desktop\Gagan\DEV\mongoBasics\node_modules\mongodb\lib\cmap\connect.js:383:20) at Socket.<anonymous> (C:\Users\Gaurav\Desktop\Gagan\DEV\mongoBasics\node_modules\mongodb\lib\cmap\connect.js:307: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, [Symbol(errorLabels)]: Set(0) {} } Node.js v18.15.0
解决方法
1. 强制使用IPv4地址连接
Node.js 18+版本默认优先将localhost解析为IPv6地址(::1),但MongoDB服务可能仅监听了IPv4的127.0.0.1。修改连接URL为:
const MONGO_URL = 'mongodb://127.0.0.1:27017';
2. 确认MongoDB服务的监听地址
打开MongoDB的配置文件(通常为mongod.cfg),找到net.bindIp配置项,确保其包含127.0.0.1和::1,或者设置为0.0.0.0(允许所有IP访问):
net: bindIp: 127.0.0.1,::1
修改后重启MongoDB服务。
3. 检查MongoDB服务状态
在Windows命令提示符中执行以下命令,确认服务正在运行:
net start MongoDB
如果服务未启动,执行上述命令启动;若服务异常,打开services.msc找到MongoDB服务,右键选择重启。
4. 移除无用依赖
项目中执行npm install node是多余操作(Node.js为全局安装,无需添加到项目依赖),执行以下命令移除:
npm uninstall node
5. 完善代码的错误处理
原代码未添加错误捕获,容易导致未处理的Promise拒绝,建议修改为:
const {MongoClient} = require('mongodb'); const MONGO_URL = 'mongodb://127.0.0.1:27017'; const DB_NAME = 'tododb'; (async () =>{ try { const client = await MongoClient.connect(MONGO_URL); const tododb = client.db(DB_NAME); console.log('数据库连接成功,数据库名称:', tododb.databaseName); // 后续操作完成后可关闭连接 // await client.close(); } catch (error) { console.error('数据库连接失败:', error); } })();
内容的提问来源于stack exchange,提问作者Gagan Arora
相关产品推荐
相关产品推荐

