问题描述
我想将与单个数据库的猫鼬连接分为两个连接(链接到模式:https://mongoosejs.com/docs/connections.html#multiple_connections)
我想要实现的目标是注入两个使用不同连接的完全相同的模型。
我认为可行的方法是注册两个MongooseModule:
@Module({
imports: [
MongooseModule.forRootAsync({
useClass: MongooseConfigFast,}),MongooseModule.forRootAsync({
useClass: MongooseConfigSlow,UsersModule,],})
export class AppModule {}
将MongooseConfigFast和MongooseConfigSlow定义为:
@Injectable()
export class MongooseConfigFast implements MongooseOptionsFactory {
createMongooseOptions():
| MongooseModuleOptions
| Promise<MongooseModuleOptions> {
return {
useNewUrlParser: true,useUnifiedTopology: true,uri: "mongodb://localhost:27017/startup",connectionName: ConnectionNames.FAST,// FAST_CONNECTION
};
}
}
现在在UsersModule中,我注册了相同的架构,但是为不同的连接提供了不同的名称:
@Module({
imports: [
MongooseModule.forFeature(
[
{
name: ConnectionNames.USERS_FAST,// Token for fast connection
schema: UserSchema,// Same User schema
collection: User.name,// Same User collection
},ConnectionNames.FAST,),MongooseModule.forFeature(
[
{
name: ConnectionNames.USERS_SLOW,// Token for slow connection
schema: UserSchema,ConnectionNames.SLOW,providers: [UsersService],controllers: [UsersController],})
export class UsersModule {}
最后我可以将两个模型注入UsersService:
@Injectable()
export class UsersService {
@InjectModel(ConnectionNames.USERS_FAST) // Usign token for fast connection
private readonly FUserModel: Model<User>;
@InjectModel(ConnectionNames.USERS_SLOW) // Using token for slow connection
private readonly SUserModel: Model<User>;
public async createUser(userInfo: UserInfoDto): Promise<User> {
return this.SUserModel.create(userInfo);
}
}
当我尝试运行它时,Nest似乎无法解析在UsersModule中注册的猫鼬模型。有人实现了吗?甚至有可能吗?
解决方法
解决了这个问题。
结果是,MongooseModule的选项工厂上的connectionName属性是猫鼬特定的配置。为了为Nest DI解析器定义令牌,我将connectionName放在MongooseModule配置中:
@Module({
imports: [
MongooseModule.forRootAsync({
useClass: MongooseConfigFast,connectionName: ConnectionNames.FAST,}),MongooseModule.forRootAsync({
useClass: MongooseConfigSlow,connectionName: ConnectionNames.SLOW,UsersModule,],controllers: [AppController],providers: [AppService],})
export class AppModule {}