我对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 },
},
);
}
}
答案 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,
) {}
}
就是这样!
希望说明有所帮助!