NestJS / TypeORM-连接到多个数据库-ConnectionNotFoundError

时间:2020-01-08 01:56:22

标签: nestjs typeorm

使用TypeORM和NestJS连接到两个数据库时,使用连接(UserConnection&PhotoConnection)注册一个自定义存储库时会抛出 ConnectionNotFoundError 对于每个数据库。我在https://github.com/masonridge/connissuewithndb处创建了一个最小的仓库。 TypeOrm注册在NestJS的AppModule中完成

(app.module.ts)

@Module({
  imports: [

    TypeOrmModule.forRootAsync({
      name: 'PhotoConnection',
      useFactory: async () => {
        return {
          type: 'sqlite',
          synchronize: true,
          database: 'TestPhoto.sqlite',
          entities: [Photo],
        } as SqliteConnectionOptions;
      },
    }),
    TypeOrmModule.forRootAsync({
      name: 'UserConnection',
      useFactory: async () => {
        return {
          type: 'sqlite',
          synchronize: true,
          database: 'TestUser.sqlite',
          entities: [User],
        } as SqliteConnectionOptions;
      },
    }),
    // TypeOrmModule.forFeature([User, UserRepository], 'UserConnection'),
    // TypeOrmModule.forFeature([Photo, PhotoRepository], 'PhotoConnection'),
    PhotoModule, UserModule,
  ],

(photo.module.ts)数据库连接1-PhotoConnection已在此处注册

@Module({
  imports: [    
    TypeOrmModule.forFeature([PhotoRepository], 'PhotoConnection'),
  ],
  providers: [
    PhotoService,
  ],
  controllers: [PhotoController],
  exports: [TypeOrmModule],
})
export class PhotoModule {}

(user.module.ts)数据库连接2-用户连接已在此处注册

@Module({
  imports: [
    TypeOrmModule.forFeature([UserRepository], 'UserConnection'),
  ],
  providers: [
    UserService,
  ],
  exports: [TypeOrmModule],
  controllers: [UserController],
})
export class UserModule {}

(user.repository.ts)自定义存储库

@EntityRepository(User)
export class UserRepository extends Repository<User> {
  async createUser(name: string): Promise<string> {
    const user = this.create();
    user.username = name;
    user.salt = 'salt';
    user.password = 'xxkdkdk';
    user.save();
    return name;
  }
}

(photo.repository.ts)

@EntityRepository(Photo)
export class PhotoRepository extends Repository<Photo> {
  async createPhoto(name: string): Promise<string> {
    const photo = this.create();
    photo.name = name;
    photo.save();
    return name;
  }
}

使用连接(PhotoConnection)将回购注入服务中 (photo.service.ts)

export class PhotoService {
  constructor(
    @InjectRepository(Photo, 'PhotoConnection')
        private readonly photoRepository: PhotoRepository,
  ) {}

,此处使用 UserConnection(user.service.ts)

@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User, 'UserConnection')
    private readonly userRepository: UserRepository,
  ) {}

应用程序可以正常启动,但在POST请求中会引发ConnectionNotFoundError错误

(节点:190812)UnhandledPromiseRejectionWarning:ConnectionNotFoundError:找不到连接“默认”。 在新的ConnectionNotFoundError(C:\ nestjs \ type-orm-dbscratch \ node_modules \ typeorm \ error \ ConnectionNotFoundError.js:10:28) 在ConnectionManager.get(C:\ nestjs \ type-orm-dbscratch \ node_modules \ typeorm \ connection \ ConnectionManager.js:38:19) 在Object.getConnection(C:\ nestjs \ type-orm-dbscratch \ node_modules \ typeorm \ index.js:244:35) 在Function.BaseEntity.getRepository(C:\ nestjs \ type-orm-dbscratch \ node_modules \ typeorm \ repository \ BaseEntity.js:67:57) 在Photo.BaseEntity.save(C:\ nestjs \ type-orm-dbscratch \ node_modules \ typeorm \ repository \ BaseEntity.js:27:33) 在PhotoRepository.createPhoto(C:\ nestjs \ type-orm-dbscratch \ dist \ db \ photo \ photo.repository.js:15:15) 在PhotoService.createPhoto(C:\ nestjs \ type-orm-dbscratch \ dist \ db \ photo \ photo.service.js:24:43) 在PhotoController.addSetting(C:\ nestjs \ type-orm-dbscratch \ dist \ db \ photo \ photo.controller.js:22:27) 在C:\ nestjs \ type-orm-dbscratch \ node_modules @ nestjs \ core \ router \ router-execution-context.js:37:29 在process._tickCallback(internal / process / next_tick.js:68:7)

我想知道注册是否存在问题。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:2)

问题似乎出在使用DataMapperActiveRecord的TypeORM方法之间。似乎使用ActiveRecord方法不支持NestJS命名存储库,因此正在寻找名为'default'的连接。如果您删除extends BaseEntity并使用存储库的save方法而不是this.save(user)user.save(),则将获得成功的保存。我没有看到立即设置ActiveRecord的连接的方法,但是如果您仍然想遵循的方法,那么它可能是某个选项。