为什么我无法使用NestJS和Mongoose连接到MongoDB?

kr98yfug  于 11个月前  发布在  Go
关注(0)|答案(8)|浏览(254)

我有一个nest.js节点服务器,我试图在应用程序中连接mongoDB数据库。模块,当连接字符串不包含DB名称-连接到默认DB“测试”成功,但当我指定DB名称-总是得到“身份验证失败”错误。
[嵌套] 53087 - 11/08/2023,6:30:46 PM错误[MongooseModule]无法连接到数据库。正在重试(1)...
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');


问题出在哪里?

oewdyzsn

oewdyzsn1#

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

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

字符串

fdbelqdn

fdbelqdn2#

根据NestJS official documentforRoot()方法从Mongoose包中接受与mongoose.connect()相同的配置对象。
你可以在mongoose.connect()的文档中看到你可以应用的所有选项。
你可以这样定义数据库名:

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

字符串

fjnneemd

fjnneemd3#

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

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

字符串

gojuced7

gojuced74#

正如@Dickson所指出的,我试图指定一个数据库,但直到我从documentation检查mongoose.connect()时才有帮助。所以下面是我的工作代码:

imports: [
    MongooseModule.forRoot('mongodb://127.0.0.1:27017', {
      dbName: 'some_database',
    }),
  ],

字符串
同:

MongooseModule.forRoot('mongodb://127.0.0.1:27017/some_database')


正如文件所说:
这是连接在默认端口(27017)上本地运行的myapp数据库所需的最小值。如果在您的计算机上连接失败,请尝试使用127.0.0.1而不是localhost。
我需要的是将localhost重命名为IP,正如@Ganesh在他的回答中试图提到的那样。

2izufjch

2izufjch5#

由于某种原因,我的nest js应用程序停止工作,错误是“无法连接到数据库”经过几个小时的挣扎,我把localhost改为127.0.0.1,一切都开始工作。
旧代码MongooseModule.forRoot('mongodb://localhost:27017/some_database')
新代码MongooseModule.forRoot('mongodb://127.0.0.1:27017/some_database')
我仍然不明白为什么会发生这种情况,以及127.0.0.1localhost有何不同

xdnvmnnf

xdnvmnnf6#

在nest js中连接MongooseModule后,我遇到了同样的问题,直到我将连接字符串mongodb://http://localhost:27017/task-prectice更改为mongodb://localhost:27017/task-prectice,或者您可以将localhost替换为127.0.0.1

sqougxex

sqougxex7#

对我来说,MongooseModule掩盖了另一个潜在的错误,我只有在用Mongoose自己重现这个问题时才发现:
MongoAPIError:URI不能包含没有值的选项
这让我发现我的appName选项没有设置值(尽管它适用于任何选项)-确保所有选项实际上都有值否则您还将面临:
错误:无法连接到数据库!返回首页
错误[ExceptionError]
不工作:

> mongodb://root:example@localhost:27017?appName=&directConnection=true...

字符串
工作:

mongodb://root:example@localhost:27017?appName=xxx&directConnection=true...

yb3bgrhw

yb3bgrhw8#

MongooseModule.forRoot('mongodb://127.0.0.1:27017', { dbName: 'myapp' })

字符串

相关问题