#ERROR [ExceptionHandler] Circular relations detected

25 messages · Page 1 of 1 (latest)

dire grail
#

Circular relations detected: TypeORMComment -> User -> User. To resolve this issue you need to set nullable: true somewhere in this dependency structure.
Hi how can I solve this issue I'm very new to nest js and don't fully see what it could be meaning.

quick bough
#

please show us those classes

dire grail
#
@Module({
  imports: [TypeOrmModule.forFeature([Review, Task]), TaskModule],
  controllers: [ReviewController],
  providers: [ReviewService],
  exports: [ReviewService],
})
export class ReviewModule {}
@Module({
  imports: [
    TypeOrmModule.forFeature([Comment, Task]),
    forwardRef(() => TaskModule),
  ],
  providers: [CommentService],
  controllers: [CommentController],
  exports: [CommentService],
})
export class CommentModule {}
@Module({
  imports: [
    TypeOrmModule.forFeature([Category, Task]),
    forwardRef(() => TaskModule),
  ],
  controllers: [CategoryController],
  providers: [CategoryService],
  exports: [CategoryService],
})
export class CategoryModule {}

@Module({
  imports: [
    TypeOrmModule.forFeature([Task, Review, Comment, Category]),
    forwardRef(() => ReviewModule),
    forwardRef(() => CommentModule),
    forwardRef(() => CategoryModule),
  ],
  providers: [TaskService],
  controllers: [TaskController],
  exports: [TaskService],
})
@Module({
  imports: [
    TypeOrmModule.forFeature([User, Role, Review, Task, Comment]),
    forwardRef(() => CommentModule),
    forwardRef(() => TaskModule),
    forwardRef(() => ReviewModule),
    forwardRef(() => RoleModule),
  ],
  controllers: [UserController],
  providers: [UserService],
  exports: [UserService],
})
@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'password',
      database: 'task_management',
      autoLoadEntities: true,
      synchronize: true,
    }),
    UserModule,
    RoleModule,
    TaskModule,
    CategoryModule,
    CommentModule,
    ReviewModule,
  ],

  controllers: [AppController],
  providers: [AppService],
})
#

@quick bough here , thanks for helping

#

category, review, comment are related to task

quick bough
#

I guess you got an issue with User

#

can you show us how it look like

#

both User and Comment entities

dire grail
#

@Entity()
export class User {
  @ApiProperty()
  @PrimaryGeneratedColumn()
  public id: number;

  @ApiProperty()
  @Column('text', { unique: true })
  @IsNotEmpty()
  @MinLength(4, {
    message: 'Enter an username of at least 4 characters.',
  })
  @MaxLength(16, {
    message: 'Enter an username of at most 16 characters.',
  })
  userName: string;

  @ApiProperty()
  @Column('text', { unique: true })
  @IsEmail({
    message: 'Please enter a valid email format.',
  })
  @IsNotEmpty()
  email: string;

  @Column('varchar', { length: 256, select: false, nullable: true })
  @Exclude({ toPlainOnly: true })
  @MinLength(6, {
    message: 'Enter a password of at least 6 characters.',
  })
  @IsNotEmpty()
  public password: string;

  @ManyToMany(() => Role, (role) => role.users, {
    eager: true,
  })
  @JoinTable({
    name: 'user_role',
    joinColumn: { name: 'user_id' },
    inverseJoinColumn: { name: 'role_id' },
  })
  public roles: Role[];

  @ApiProperty()
  @Column('text', { default: null, nullable: true })
  public forgotToken: string;

  @ApiProperty()
  @Column('bool', { default: false })
  public verified: boolean;

  @ApiProperty()
  @CreateDateColumn()
  public created: Date;

  @ApiProperty()
  @UpdateDateColumn()
  public modified: Date;

  @ManyToOne(() => User, { nullable: false })
  @JoinColumn({ name: 'created_by' })
  createdBy: User;

  @ApiProperty()
  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'modified_by' })
  public modifiedBy: User;
}
#
@Entity()
export class Comment {
  @ApiProperty()
  @PrimaryGeneratedColumn()
  public id: number;

  @ApiProperty()
  @Column('text', { nullable: false })
  text: string;

  @ManyToOne(() => Task, (task) => task.taskReviews, {
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE',
  })
  @JoinColumn({ name: 'task_id' })
  public task!: Task;

  @ApiProperty()
  @CreateDateColumn()
  public created: Date;

  @ApiProperty()
  @UpdateDateColumn()
  public modified: Date;

  @ManyToOne(() => User, { nullable: false })
  @JoinColumn({ name: 'created_by' })
  createdBy: User;

  @ApiProperty()
  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'modified_by' })
  public modifiedBy: User;
}
quick bough
#

and the whole error message
Could be an screenshot

dire grail
quick bough
#

ok, so I'm pretty sure that this is related with typeorm
not nestjs

dire grail
#

There's also role module

#
@Module({
  imports: [TypeOrmModule.forFeature([Role])],
  providers: [RoleService],
  controllers: [RoleController],
})
export class RoleModule {}

quick bough
#

did you have strictNullChecks: true in your tsconfig?

dire grail
#

it's set to false "strictNullChecks": false,

quick bough
#

ok. It's fine
I'm trying to figure out why you got that

dire grail
#

i suspect i did wrong in entity or imports

#

i think i foun dit

quick bough
#

what about doing this:

  @ManyToOne('User', { nullable: false })
  @JoinColumn({ name: 'created_by' })
  createdBy: User;

not sure if it works

dire grail
#
 @ManyToOne(() => User, { nullable: false })
  @JoinColumn({ name: 'created_by' })
  createdBy: User;

  @ApiProperty()
  @ManyToOne(() => User, { nullable: true })
  @JoinColumn({ name: 'modified_by' })
  public modifiedBy: User;
#

this is the problem

#

yes