NestJS / TypeORM - подключение к нескольким базам данных - ConnectionNotFoundError - PullRequest
0 голосов
/ 08 января 2020

Соединение с двумя базами данных с использованием TypeORM и Nest JS выдает ConnectionNotFoundError , когда пользовательский репозиторий регистрируется с использованием соединения (UserConnection & PhotoConnection) one для каждой базы данных. Я создал минимальное репо здесь https://github.com/masonridge/connissuewithndb. Регистрация TypeOrm выполняется в AppModule of Nest JS

(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 - здесь зарегистрировано UserConnection

@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 \ маршрутизатор-исполнение -context. js: 37: 29 at process._tickCallback (internal / process / next_tick. js: 68: 7)

Я хотел бы знать, если есть проблема с Регистрация. Любая помощь будет оценена.

1 Ответ

1 голос
/ 08 января 2020

Похоже, проблема заключается в использовании подхода TypeORM DataMapper и ActiveRecord . Кажется, использование подхода ActiveRecord не поддерживает именованные репозитории с Nest JS, и поэтому ищет соединение с именем 'default'. Если вы удалите extends BaseEntity и воспользуетесь методом сохранения хранилища вместо this.save(user) против user.save(), вы получите успешное сохранение. Я не видел немедленного способа установить соединение с ActiveRecord, но это может быть вариант где-то, если вы все еще придерживаетесь этого подхода.

...