nestjs - 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,
},
});
这是在App Module内部编写的代码
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 接口中的一个可选属性。
MongooseModule接口
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'),
};
}
}
猫鼬模块导入:
//...
MongooseModule.forRootAsync({
imports: [ConfigModule],
useClass: MongodbConfigService,
}),
//...
如果要将 MongoDB 配置为配置命名空间:
制作一个文件来保存配置:
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]
}),
//...
猫鼬模块导入:
//...
MongooseModule.forRootAsync({
useFactory:(configService:ConfigService)=>{
return this.configService.get<MongooseModuleOptions>('mongo_db')
},
inject: [ConfigService],
}),
//...
这两种方法都应该有效。
顺便说一句:副本集和身份验证源是从我的配置中复制的。如果您没有副本设置,请忽略它。
推荐阅读
- excel - Excel数组公式异常
- node.js - Node + Express API 在生产中不起作用
- android - 如何使用 Wifi 连接获取强制门户重定向 URL 表单 webview?
- javascript - 如何让 JavaScript 画布游戏暂停?
- java - 我怎样才能使 RecyclerView 更流畅?
- excel - VBA EDITOR 在 Mac 上退出(终止)Excel 2016
- javascript - Highcharts 工具提示显示在 div 上
- java - spring-boot:我可以修复 spring-boot 2 中的下一个错误吗?
- r - 如何在 scale_x_date 中定义 date_breaks 的原点
- sql - SQL查询,统计类似时间戳值的个数并显示总和