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',因为它未定义”

我不明白为什么会抛出这个错误,因为“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;
}

解决方法

您的 useFactory 不返回任何内容,因此没有可供 MongooseModule 使用的选项。就像做这样的事情

function getConfig(configService) {
  config.get('CONFIG_KEY');
}

const config = getConfig(configServce);
console.log(config) // undefined

工厂函数不返回值,所以它是未定义的。您可以添加 return configServicce.get('mongoConfig'),它应该会按预期工作。或者您可以使用 () => ({}) 使匿名箭头函数返回一个对象。 () 周围的 {} 对于内联返回对象非常重要,否则 JS 会认为它是函数体。

,

如果您要使用 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'),};
  }
}

猫鼬模块导入:

//...
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,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]
    }),//...

猫鼬模块导入:

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

这两种方法都应该有效。

顺便说一句:副本集和身份验证源是从我的配置中复制的。如果您没有副本设置,请忽略它。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...