【发布时间】:2021-10-05 07:18:19
【问题描述】:
实际学习 NestJs 并面临保存 typeorm OneToMany 关系的问题。 假设我有两个模块 ProjectsModule @ PlansModule
在计划和项目实体之间存在 OneToMany 关系
@Entity()
export class Project extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
...
@OneToMany(type => Plan, plan => plan.project, { eager: true })
plans: Plan[];
}
@Entity()
export class Plan extends BaseEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
...
@ManyToOne(type => Project, project => project.plans, { eager: false } )
project: Project;
@Column()
projectId: string;
}
在 ProjectsModule 中,我有一个使用此方法的 ProjectsService:
async getProjectById(
id: string,
user: User
): Promise<Project> {
const found = await this.projectRepository.findOne({ where: { id, ownerId: user.id } });
if(!found) {
throw new NotFoundException(`Project with ID "${id}" not found`)
}
return found;
}
我的问题是当我尝试保存新计划时。 我的 PlansService 像这样调用 PlanRepository
async createPlan(
createPlanDto: CreatePlanDto,
user: User
): Promise<Plan> {
return this.planRepository.createPlan(createPlanDto, user);
}
在 PlanRepository 上:
constructor(
@Inject(ProjectsService)
private projectsService: ProjectsService
) {
super();
}
async createPlan(
createPlanDto: CreatePlanDto,
user: User
): Promise<Plan> {
const { title, description, project } = createPlanDto;
const plan = new Plan();
const projectFound = await this.projectsService.getProjectById(project, user)
plan.title = title;
plan.description = description;
plan.status = PlanStatus.ENABLED;
plan.owner = user;
plan.project = project;
try {
await plan.save();
} catch (error) {
this.logger.error(`Failed to create a Plan for user "${user.email}". Data: ${JSON.stringify(createPlanDto)}`, error.stack);
throw new InternalServerErrorException();
}
delete plan.owner;
return plan;
}
在向我的计划控制器发送 POST 请求时尝试这样做会引发此错误:
TypeError: this.projectsService.getProjectById is not a function
尝试一下
console.log('service', this.projectsService)
给我
service EntityManager {
repositories: [],
plainObjectToEntityTransformer: PlainObjectToNewEntityTransformer {},
connection: Connection {
我想我没有正确使用 projectsService,但我不明白我可能在哪里犯了错误。
在模块方面,我将 ProjectsService 导出到他的模块中:
exports: [ProjectsService]
并将完整的 ProjectsModule 导入 PlansModule:
imports: [
TypeOrmModule.forFeature([PlanRepository]),
AuthModule,
ProjectsModule
],
抱歉,这篇文章太长了,试图详尽无遗。
【问题讨论】:
-
长篇文章更好,理想情况下你能在回购中复制这个吗?
-
Here 是
-
你走在正确的轨道上,你决定覆盖存储库有什么原因吗?我建议按照单一责任模式将其提升到服务中,如果我是你,我会考虑使用拦截器。如果您认为这会有所帮助,我很乐意证明这一点。你肯定离得不远,但我会考虑不要覆盖存储库(当然,除非你有理由这样做)
标签: javascript nestjs typeorm