Nest не может разрешить зависимости FeedService (?, FeedItemTypeRepository, FeedTypeRepository, RefundService) - PullRequest
0 голосов
/ 22 сентября 2019

Я довольно новичок в узле js & nest, у меня в основном есть FeedModule (с FeedRepository \ FeedItemTypeRepository \ FeedTypeRepository) и RefundModule (с RefundService)

вот текущее состояние:

FeedModule:

@Module({
  imports: [
    TypeOrmModule.forFeature([Feed, FeedRepository]),
    TypeOrmModule.forFeature([FeedItemType, FeedItemTypeRepository]),
    TypeOrmModule.forFeature([FeedType, FeedTypeRepository]),
    RefundModule
  ],
  controllers: [FeedController],
  providers: [FeedProvider, FeedService, FeedItemTypeRepository,FeedTypeRepository,],
  exports: [FeedService,],
})
export class FeedModule {
}

FeedService:

@Injectable()
export class FeedService {

  constructor(
    @InjectRepository(FeedRepository)
    private readonly feedRepository: FeedRepository,
    private readonly feedItemTypeRepository: FeedItemTypeRepository,
    private readonly feedTypeRepository: FeedTypeRepository,
    private readonly refundService: RefundService,

    // private readonly timeService: TimeService,
  ) {
  }}

RefundModule:

@Module({
  imports: [

    TypeOrmModule.forFeature([Refund, RefundRepository]),
    TypeOrmModule.forFeature([RefundCurrency, RefundCurrencyRepository]),
    TypeOrmModule.forFeature([RefundStatus, RefundStatusRepository]),
    TypeOrmModule.forFeature([RefundType, RefundTypeRepository]),
    TypeOrmModule.forFeature([Feed, FeedRepository]),
    TypeOrmModule.forFeature([FeedItemType, FeedItemTypeRepository]),
    TypeOrmModule.forFeature([FeedType, FeedTypeRepository]),


    FlightModule,
  ],
  controllers: [RefundController, refundsByFlightController,RefundDetailsController],
  providers: [RefundProvider, RefundService, FlightService],
  exports: [FlightService, RefundService],
})
export class RefundModule {
}
export class RefundCurrencyModule {
}
export class RefundStatusModule {
}
export class RefundTypeModule {
}
export class UserModule {
}

любая информация будет делать по этому вопросу, что мне не хватает?Можно ли назвать несколько репозиториев в одном модуле \ Сервисе

Я перепробовал много изменений, но безрезультатно, если кто-нибудь может указать мне правильное направление.Спасибо за помощь!

Подробнее: -FeedRepo:

@EntityRepository(Feed)
export class FeedRepository extends Repository<Feed> {
  getFeedItemsByUserId(id: number): Promise<Feed[]> {
    return this.createQueryBuilder('feed')
      .select([
        'feed.id',
        'feed.userId',
        'feed.type',

        'feed.createdAt',
      ])
      .leftJoinAndSelect('feed.itemType', 'itemType')
      .leftJoinAndSelect('feed.fkRefundFeed', 'refunds')
      .leftJoinAndSelect('refunds.currency', 'refundCurrency')
      .leftJoinAndSelect('refunds.status', 'refundStatus')
      .leftJoinAndSelect('refunds.type', 'refundtype')

      .leftJoinAndSelect('refunds.fkFlightRefund', 'flight')
      .leftJoinAndSelect('feed.fkFlightFeed', 'flights')
      .where({ userId: id })
      .getMany();
  }

  async addFeedItem(feed:Feed) {
   await this.createQueryBuilder().insert().into(Feed).values(feed).execute();
 }
}

-FeedItemType:

@EntityRepository(FeedItemType)
export class FeedItemTypeRepository extends Repository<FeedItemType> {

  getFeedItemType(id: number): Promise<FeedItemType> {
    return this.findOne(
      {
        join: {
          leftJoinAndSelect:
            { key: 'refund.fkFlightRefund' },
          alias: 'refund',
        },
        where: { id: id },
      },
    );
  }
}

FeedType:

@EntityRepository(FeedType)
export class FeedTypeRepository extends Repository<FeedType> {

  getFeedType(id: number): Promise<FeedType> {
    return this.findOne(
      {
        join: {
          leftJoinAndSelect:
            { key: 'refund.fkFlightRefund' },
          alias: 'refund',
        },
        where: { id: id },
      },
    );
  }
}

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

FeedRepository также должен быть добавлен к провайдерам.Я на самом деле не знаю код, но forFeature () должен содержать список сущностей, так что вы можете удалить репозитории оттуда.И если вы используете собственный репозиторий, вам нет необходимости вставлять его, вы можете запросить его у менеджера / соединения typeorm.Я не пробовал это, но согласно документации: https://github.com/typeorm/typeorm/blob/master/docs/custom-repository.md

0 голосов
/ 24 сентября 2019

В @nestjs/typeorm @InjectRepository требуется объект, который был передан TypeOrmModule.forFeature(), потому что метод forFeature создает репозитории с токеном с прототипом объекта (вероятно, что-то вроде repository_${Entity.constructor.prototype}).В вашем случае, используя сущность Feed, метод forFeature уже создал вам хранилище с токеном, похожим на repository_Feed.

Когда вы используете @InjectRepository(), все, что вы делаете, - вводите класс с токеном repository_Feed.В вашем случае вы используете собственный репозиторий.Таким образом, ваш токен будет не repository_Feed, а вместо FeedRepository.

Иногда я запутываюсь, но я думаю о контейнере как о хранилище значений ключа, а «обеспечить» или «токен» - как ключ, а класс - как значение.Когда мы используем Inject или Inject $ {insert name here}, мы запрашиваем эти значения, используя ключ!Так что Nest cannot resolve provider обычно означает, что ключ не существует в контейнере!

Итак, к вашему коду!Мы не хотим использовать @InjectRepository, потому что у нас есть пользовательское репо.Вместо этого используйте метатип.

export class FeedService {
  constructor(
    private readonly feedRepository: FeedRepository,
  ) {}
}

И все!

Надеюсь, объяснение помогло!

...