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;
}

如果您想要异步MongoDB配置,请选择一个单独的配置类。我将解释如何:

制作一个新的服务来解析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命名空间:

制作一个用于保存配置的文件: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],
}),
//...

这两种方法都应该奏效。

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

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

function getConfig(configService) {
config.get('CONFIG_KEY');
}
const config = getConfig(configServce);
console.log(config) // undefined

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

MongooseModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
uri: configService.get<string>('MONGODB_URI'),
}),
inject: [ConfigService],
});

只需将Mongoose动态导入代码更正为该代码,并替换您的MONGO_URI密钥。

最新更新