NestJS连接MongoDB报MongooseServerSelectionError的排查与解决
NestJS + Mongoose 连接MongoDB失败:ECONNREFUSED ::1:27017
错误信息
[Nest] 3372 - 08/24/2024, 9:32:12 PM ERROR [MongooseModule] Unable to connect to the database. Retrying (1)... MongooseServerSelectionError: connect ECONNREFUSED ::1:27017 at _handleConnectionErrors (C:\Users\Tarek\Desktop\auth\my-app\node_modules\mongoose\lib\connection.js:897:11) at NativeConnection.asPromise (C:\Users\Tarek\Desktop\auth\my-app\node_modules\mongoose\lib\connection.js:1360:11) at C:\Users\Tarek\Desktop\auth\my-app\node_modules\@nestjs\mongoose\dist\mongoose-core.module.js:40:125
相关代码(AppModule)
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthModule } from './auth/auth.module'; import { MongooseModule } from '@nestjs/mongoose'; import { UserSchema } from './auth/schemas/user.schema'; @Module({ imports: [ MongooseModule.forRoot('mongodb://localhost:27017/MyApp'), AuthModule, // Other modules ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
当前排查情况
- 本地MongoDB服务正常,
mongod和mongosh均可正常连接 - 已确认MongoDB监听默认端口27017
- 检查过防火墙/网络设置,未拦截连接
- 已重启MongoDB服务
问题
连接被拒绝的可能原因是什么?该如何解决?NestJS或Mongoose配置是否有遗漏?
解决方法
1. 替换localhost为127.0.0.1
错误显示连接的是::1:27017(IPv6本地地址),可能是系统对localhost的解析优先走IPv6,但MongoDB仅监听了IPv4地址。修改连接字符串为:
MongooseModule.forRoot('mongodb://127.0.0.1:27017/MyApp')
强制使用IPv4连接,避免解析冲突。
2. 检查MongoDB绑定地址配置
打开MongoDB配置文件(如mongod.cfg),找到net.bindIp项,确认其设置为127.0.0.1或0.0.0.0(允许所有IP访问),而非仅绑定特定IPv6地址。若之前修改过该配置,可能导致仅能通过特定IP连接。
3. 验证版本兼容性
检查@nestjs/mongoose与Mongoose核心版本是否匹配。版本不兼容可能引发连接逻辑异常。可通过npm list mongoose查看版本,必要时升级/降级到兼容版本(例如@nestjs/mongoose 10.x对应mongoose 7.x或8.x)。
4. 强制使用IPv4连接选项
若替换地址无效,可在连接配置中强制禁用IPv6:
MongooseModule.forRoot('mongodb://localhost:27017/MyApp', { family: 4 // 强制使用IPv4协议 })
5. 排查环境变量干扰
确认项目中是否存在环境变量(如MONGODB_URI)覆盖了代码中的连接字符串。例如.env文件若配置了其他地址,会导致实际连接地址与代码不一致。
内容的提问来源于stack exchange,提问作者Tarek Ziad
相关产品推荐
相关产品推荐

