无法使用 nestjs/mongoose 连接 mongoDB

Posted

技术标签:

【中文标题】无法使用 nestjs/mongoose 连接 mongoDB【英文标题】:Unable to connect mongoDB using nestjs/mongoose 【发布时间】:2021-02-17 01:19:48 【问题描述】:

我有一个nest.js节点服务器,我试图在app.module中连接mongoDB数据库,当连接字符串不包含数据库名称时 - 连接到默认数据库“测试”成功,但是当我指定了数据库名称 - 总是出现“身份验证失败”错误。

app.module.ts:

这行得通:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000'),
  ]

但是这个指定数据库名称失败并出现身份验证错误:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000/test'),
  ]

或:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000/data'),
  ]

直接使用MongoClient(不用nestjs)连接成功:

const client = new MongoClient('mongodb://admin:admin@localhost:30000');
await client.connect();
db = client.db('data');

知道我的问题是什么,我应该怎么做才能解决这个问题?

谢谢。

【问题讨论】:

看看***.com/questions/63754742/… 【参考方案1】:

将数据库名称指定为连接选项 - 不作为连接字符串的一部分解决了问题:

imports: [
    MongooseModule.forRoot(
       uri: 'mongodb://admin:admin@localhost:30000',
       dbName: 'data'
    ),
  ]

【讨论】:

【参考方案2】:

@nestjs/mongoose 的最新版本实际上不支持此功能,例如在 ^7.2.4 版本中,它接收一个字符串作为第一个参数,接收一个对象作为第二个参数,所以对我有用的是:

   imports: [
      MongooseModule.forRoot(
      'mongodb://user:password@localhost:27017/nestjs-tutorial?authSource=admin&readPreference=primary',
    ),
    customModule,
   ],

【讨论】:

【参考方案3】:

根据NestJS official document,forRoot() 方法接受与来自 Mongoose 包的mongoose.connect() 相同的配置对象。

您可以这样定义数据库名称:

imports: [
  MongooseModule.forRoot('mongodb://admin:admin@localhost:30000', 
    dbName: 'custom_db_name',
  )
]

【讨论】:

以上是关于无法使用 nestjs/mongoose 连接 mongoDB的主要内容,如果未能解决你的问题,请参考以下文章

Nestjs - Mongoose - 虚拟字段 - 无法在 graphql 操场上查询

无法在关系 nestjs/mongoose 上查询条件

在 @nestjs/mongoose 中设置 mongoose 全局选项

NestJs/Mongoose 中的自动增量序列

NestJS - 如何自我引用 mongoDB 架构 @nestjs/mongoose?

@nestjs/mongoose 的文档