无法使用 nestjs/mongoose 连接 mongoDB

use*_*448 0 mongoose mongodb node.js nestjs

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

app.module.ts:

这有效:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000'),
  ]
Run Code Online (Sandbox Code Playgroud)

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

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000/test'),
  ]
Run Code Online (Sandbox Code Playgroud)

或者:

  imports: [
    MongooseModule.forRoot('mongodb://admin:admin@localhost:30000/data'),
  ]
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢。

小智 7

根据NestJS 官方文档,方法接受与 Mongoose 包中forRoot()相同的配置对象。mongoose.connect()

您可以在mongoose.connect()的文档中看到您可以应用的所有选项。

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

imports: [
  MongooseModule.forRoot('mongodb://admin:admin@localhost:30000', {
    dbName: 'custom_db_name',
  })
]
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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


use*_*448 5

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

imports: [
    MongooseModule.forRoot({
       uri: 'mongodb://admin:admin@localhost:30000',
       dbName: 'data'
    }),
  ]
Run Code Online (Sandbox Code Playgroud)