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)
将数据库名称指定为连接选项 - 不是作为连接字符串的一部分解决了问题:
imports: [
MongooseModule.forRoot({
uri: 'mongodb://admin:admin@localhost:30000',
dbName: 'data'
}),
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2107 次 |
| 最近记录: |