Nest无法解析FeedService的依赖项(?,FeedItemTypeRepository,FeedTypeRepository,RefundService)

时间:2019-09-22 13:13:03

标签: node.js typescript nestjs

我对Node 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 {
}

有关此信息,我会缺少什么?可以在一个Module \ Service中调用几个存储库

我已经尝试了许多更改,但如果有人能指出正确的方向,那将毫无效果。谢谢您的帮忙!

更多信息: -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 个答案:

答案 0 :(得分:1)

FeedRepository也应添加到提供程序。 我不太清楚代码,但是forFeature()应该包含实体列表,因此您可以从那里删除存储库。 而且,如果您使用自定义存储库,则无需注入它,可以从typeorm管理器/连接中请求它。我没有尝试过,但是根据文档: https://github.com/typeorm/typeorm/blob/master/docs/custom-repository.md

答案 1 :(得分:0)

@nestjs/typeorm中,@InjectRepository需要一个传递给TypeOrmModule.forFeature()的实体,因为forFeature方法使用带有实体原型的令牌(可能类似于repository_${Entity.constructor.prototype})来创建存储库。在使用实体Feed的情况下,forFeature方法已经创建了一个带有类似于repository_Feed的令牌的存储库。

使用@InjectRepository()时,所要做的就是向类注入令牌repository_Feed。在您的情况下,您正在使用自定义存储库。因此,您的令牌将不是repository_Feed,而是FeedRepository

  

有时我会感到困惑,但是我认为容器就像一个键值存储,而“ provide”或“ token”是键,而类是值。当我们使用Inject或Inject $ {在此处插入名称}时,我们正在使用密钥要求这些值!因此,Nest cannot resolve provider通常意味着密钥在容器中不存在!

您的代码也是如此!我们不想使用@InjectRepository,因为我们有一个自定义存储库。请改用元类型。

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

就是这样!

希望说明有所帮助!