【问题标题】:Unable to configure nestjs/mongoose, initial database无法配置nestjs/mongoose,初始数据库
【发布时间】:2020-04-03 20:45:27
【问题描述】:

我不确定我是否理解 nestjs/mongoose 配置。

我没有得到任何结果,我假设它正在查询我的管理数据库。

app.module.ts:

import { ConfigService } from './config/config.service';
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';

import { ConfigModule } from './config/config.module';
import { CaseAssetsModule } from './case-assets/case-assets.module';

@Module({
  imports: [
    ConfigModule,
    CaseAssetsModule,
    MongooseModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: async (configService: ConfigService) => ({
        uri: configService.getString('mongodb.uri'),
        useNewUrlParser: true,
        useUnifiedTopology: true,
      }),
      inject: [ConfigService],
    })
  ],
  controllers: [],
  providers: [],
})
export class AppModule { }

我的配置设置:

mongodb.uri = mongodb://<<myuser>>:<<mypwd>>#@<<myserver>>:27017/admin

case-assets.module.ts:

import { AssetSchema } from './asset.schema';
import { Module } from '@nestjs/common';
import { MongooseModule } from '@nestjs/mongoose';
import { CaseAssetsController } from './case-assets.controller';
import { CaseAssetsService } from './case-assets.service';

@Module({
  imports: [MongooseModule.forFeature([{ name: 'Asset', schema: AssetSchema, collection: 'assets' }])],
  controllers: [CaseAssetsController],
  providers: [CaseAssetsService]
})
export class CaseAssetsModule {}

在哪里指定要连接的数据库?我指定了 admin,因为那是我进行身份验证的数据库。

吉娜

【问题讨论】:

    标签: mongodb mongoose nestjs


    【解决方案1】:

    您已经通过MongooseModule.forRootAsync() 方法的配置确定了要连接的数据库。从那里,MongooseModule.forFeature() 使用的任何东西都使用相同的配置(即相同的数据库)

    使用解决方案编辑

    好的,现在我明白了这个问题。看起来像 mongo 你可以提供一个authSource 查询参数,比如mongodb://mongodb1.example.com:27317,mongodb2.example.com:27017/?authSource=authDB。只要您需要对数据库中的每个模型进行身份验证,这种 URI 就应该处理它。您可以将其传递给MongooseModule.forRoot({})MongooseModule.forRootAsync({}) 配置。

    但是,如果您需要针对每个模型进行此操作,我认为当前的 MongooseModule 无法处理。

    编辑

    两个连接的解决方案:

    app.module.ts

    MongooseModule.forRootAsync({
     imports: [ConfigModule],
     connectionName: 'firstDB',
     useFactory: async (config: ConfigService) => ({
      uri: config.get('app.firstDB'),
      useNewUrlParser: true,
      useUnifiedTopology: true,
     }),
     inject: [ConfigService],
    }),
    MongooseModule.forRootAsync({
     imports: [ConfigModule],
     connectionName: 'secondDB',
     useFactory: async (config: ConfigService) => ({
      uri: config.get('app.secondDB'),
      useNewUrlParser: true,
      useUnifiedTopology: true,
     }),
     inject: [ConfigService],
    }),
    

    cats.module.ts

    @Module({
     imports: [
      MongooseModule.forFeature(
       [
         {
          name: 'Cat',
          schema: CatSchema,
          collection: 'cats',
         },
        ],
       'firstDB',
      ),
     ],
    })
    export class CatsModule {}
    

    dogs.module.ts

    @Module({
     imports: [
      MongooseModule.forFeature(
       [
         {
          name: 'Dog',
          schema: DogSchema,
          collection: 'dogs',
         },
        ],
       'secondDB',
      ),
     ],
    })
    export class DogsModule {}
    

    【讨论】:

    • 在 MongooseModule.forRootAsync() 中,我在哪里配置要连接的数据库?在我的连接字符串中,我指定了我要对其进行身份验证的那个。认证数据库和我要连接的数据库不同。
    • There is an issue about it here 举个例子。我也会将示例添加到我的答案中
    • 我不确定你是否理解我的意思。我只想连接到一个数据库。我无法连接到 secondDB,因为我必须针对 firstDB 进行身份验证。在 Mongo 中,“admin”数据库设置为我的身份验证数据库。
    • 我不确定我明白你所说的auth against firstDB 的意思。您是否将身份验证保存在一个数据库中,而将数据保存在另一个数据库中?对我来说,这听起来仍然像是两个数据库,但我不确定您正在尝试使用哪种设置
    • 正确。在 mongo 中,您可以选择保存用户身份验证的位置。我使用管理员。所以猫和狗在seconddb。在您的示例中,secondb 是否知道有关 firstdb 的任何信息?我无法登录到 seconddb,因为身份验证是 admindb。
    猜你喜欢
    • 2021-06-27
    • 2020-12-21
    • 1970-01-01
    • 2023-04-08
    • 2019-08-08
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 2017-05-11
    相关资源
    最近更新 更多