Nestjs:无法异步连接mongo [英] Nestjs: Unable to connect mongo asynchronously

查看:22
本文介绍了Nestjs:无法异步连接mongo的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法异步连接到MongoDB。请让我知道我做错了什么。

MongoConfig文件:

import { MongooseModuleOptions } from '@nestjs/mongoose';

export default (): { mongoConfig: MongooseModuleOptions } => ({
  mongoConfig: {
    uri: process.env.DB_URI,
    connectionName: 'learn-nest',
    useCreateIndex: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
    useNewUrlParser: true,
  },
});

以下是应用程序模块内部编写的代码

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { MongooseModule } from '@nestjs/mongoose';
import { ConfigModule, ConfigService } from '@nestjs/config';

@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: ['.env'],
      isGlobal: true,
      cache: true,
    }),
    MongooseModule.forRootAsync({
      useFactory: (configService: ConfigService): any => {
        configService.get('mongoConfig');
      },
      inject: [ConfigService],
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

这是它引发的错误:

无法分解"mongooseModuleOptions"的属性"retryAttempts",因为该属性未定义&qot;

我不明白它为什么引发此错误,因为"retryAttempts"是MongooseModuleOptions接口中的可选属性。

MongooseModuleInterface

export interface MongooseModuleOptions extends ConnectOptions, Record<string, any> {
    uri?: string;
    retryAttempts?: number;
    retryDelay?: number;
    connectionName?: string;
    connectionFactory?: (connection: any, name: string) => any;
}

推荐答案

如果您要使用async MongoDB configuration,请使用单独的配置类。我将解释如何:

创建用于解析MongoDB配置的新服务。

mongodb.config.service.ts

import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import {
  MongooseModuleOptions,
  MongooseOptionsFactory,
} from '@nestjs/mongoose';

@Injectable()
export class MongodbConfigService implements MongooseOptionsFactory {

  constructor(private readonly configService: ConfigService) {}

  //You can retrun promise as well
  public createMongooseOptions(): MongooseModuleOptions {
    return {
      //MONGODB_URL is in .env file
      //MONGO_REPL_SET is in .env file
      //MONGO_AUTH_SOURCE is in .env file
      uri: this.configService.get<string>('MONGODB_URL'),
      useNewUrlParser: true,
      useFindAndModify: false,
      useCreateIndex: true,
      useUnifiedTopology: true,
      replicaSet: this.configService.get<string>('MONGO_REPL_SET'),
      authSource:  this.configService.get<string>('MONGO_AUTH_SOURCE'),
    };
  }
}

Mongoose模块导入:

//...
MongooseModule.forRootAsync({
      imports: [ConfigModule],
      useClass: MongodbConfigService,
    }),
//...

如果要将MongoDB配置为config namespace

创建用于保存配置的文件: mongodb.config.ts

import { registerAs } from '@nestjs/config';

// @returns MongooseModuleOptions
export default registerAs('mongo_db', () => ({
      //MONGODB_URL is in .env file
      //MONGO_REPL_SET is in .env file
      //MONGO_AUTH_SOURCE is in .env file
      uri: process.env.MONGODB_URL,
      useNewUrlParser: true,
      useFindAndModify: false,
      useCreateIndex: true,
      useUnifiedTopology: true,
      replicaSet: process.env.MONGO_REPL_SET,
      authSource: process.env.MONGO_AUTH_SOURCE,
}));

现在在配置模块导入中:

import mongoDbConfig from '<path>/mongodb.config';
//...
ConfigModule.forRoot({
      envFilePath: ['.env'],
      isGlobal: true,
      cache: true,
      load:[mongoDbConfig]
    }),
//...

Mongoose模块导入:

//...
MongooseModule.forRootAsync({
    useFactory:(configService:ConfigService)=>{
       return this.configService.get<MongooseModuleOptions>('mongo_db')
       },
    inject: [ConfigService],
    }),
//...

这两种方法都应该有效。

顺便说一句:副本集和授权源是从我的配置中复制的。如果您没有安装副本,请忽略它。

这篇关于Nestjs:无法异步连接mongo的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆