为什么MongoDB已启动且可视化工具可连,Node.js用Mongoose连本地库报MongoNetworkError
本地MongoDB连接报错解决方案
问题描述
- 本地已正常启动MongoDB服务,第三方可视化工具可正常连接,MongoDB启动状态可参考配套启动截图,完整报错过程可参考配套报错演示动图。
- 当前使用的Node.js连接代码:
mongoose.connect("mongodb://localhost:27017/chat", { useNewUrlParser: true }).catch(err => console.log(err));
- 运行后返回完整错误堆栈:
MongoNetworkError: failed to connect to server [localhost:27017] on first connect [MongoNetworkError: connection 0 to localhost:27017 closed at Socket.<anonymous> (D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\connection.js:439:9) at Object.onceWrapper (events.js:422:26) at Socket.emit (events.js:315:20) at TCP.<anonymous> (net.js:673:12)] at Pool.<anonymous> (D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\topologies\server.js:438:11) at Pool.emit (events.js:315:20) at D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\pool.js:562:14 at D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\pool.js:995:11 at callback (D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\connect.js:75:5) at D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\connect.js:101:9 at _callback (D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\connection.js:328:7) at Connection.errorHandler (D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\connection.js:343:7) at Object.onceWrapper (events.js:422:26) at Connection.emit (events.js:315:20) at Socket.<anonymous> (D:\Web开发\fake-chatroom\server\node_modules\mongodb\lib\core\connection\connection.js:437:12) at Object.onceWrapper (events.js:422:26) at Socket.emit (events.js:315:20) at TCP.<anonymous> (net.js:673:12)
排查与解决步骤
- 替换连接字符串地址:将
localhost改为127.0.0.1- Windows环境下Node.js默认会将
localhost优先解析为IPv6地址::1,但MongoDB服务默认仅监听IPv4的127.0.0.1:27017,会出现连接建立后立即被断开的情况,和报错表现完全匹配。
- Windows环境下Node.js默认会将
- 补全Mongoose连接配置项
原代码仅配置了useNewUrlParser: true,需补充以下兼容参数,解决旧驱动与新版MongoDB的协议不兼容问题:mongoose.connect("mongodb://127.0.0.1:27017/chat", { useNewUrlParser: true, useUnifiedTopology: true, serverSelectionTimeoutMS: 5000 }).catch(err => console.log(err)); - 检查依赖版本匹配性
- 确认本地MongoDB服务版本,如果是MongoDB 5.0及以上版本,需将Mongoose依赖升级到6.x及以上版本,旧版Mongoose内置的mongodb驱动版本过低,无法完成新协议的握手,会直接触发连接关闭的报错。
- 可通过
mongod --version命令查看本地MongoDB版本,通过npm list mongoose查看项目内Mongoose版本,确保二者版本兼容。
- 验证MongoDB监听地址
执行netstat -ano | findstr 27017查看端口监听状态,确认MongoDB是否同时监听IPv4和IPv6地址,如果仅监听IPv4地址,强制使用IPv4地址连接即可。
内容的提问来源于stack exchange,提问作者jsun969
相关产品推荐
相关产品推荐

