node.js - Kan inte implementera främmande nyckelbegränsning i en en-till-många-relation i NestJS med TypeORM


Jag försöker etablera en en-till-många-relation mellan två entiteter (Token och User) i min NestJS-applikation med hjälp av TypeORM. Jag har definierat entiteterna som visas nedan:

För Token-enheten:

@Entity('tokens')
export default class Token {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true, nullable: false })
  token: string;

  @ManyToOne(() => User, (user) => user.tokens)
  @JoinColumn({ name: 'user' })
  user: User;

  @Column({ unique: true, nullable: false })
  @Generated('uuid')
  refreshToken: string;

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

Och användarentiteten:

@Entity('users')
export default class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ unique: true, nullable: false })
  mobileNumber: string;

  @Column({ length: 25, nullable: true })
  firstName: string;

  @Column({ length: 25, nullable: true })
  lastName: string;

  @Column('json', { nullable: false })
  secret: any;

  @OneToMany(() => Token, (token) => token.user)
  @JoinColumn({ name: 'tokens' })
  tokens: Token[];

  @CreateDateColumn()
  createdAt: Date;

  @UpdateDateColumn()
  updatedAt: Date;
}

Men när jag försöker köra koden stöter jag på följande fel:

[Nest] 51035  - 07/17/2023, 8:11:20 PM   ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
QueryFailedError: foreign key constraint "FK_2b37c2056a01602dbc597d716e8" cannot be implemented

Jag är inte säker på vad som orsakar detta problem och all hjälp med att felsöka detta skulle uppskattas mycket.

Jag försöker helt enkelt ha en en-till-många-relation mellan Tokens och Användare. Tack!

Svar #1

Det kan vara för sent, men jag antar att problemet är @JoinColumn() dekoratorn på "One" sidan av relationen. Från Token-sidan är det tydligt att @JoinColumn("user") kommer att översättas till en kolumn som heter "user" som kommer att hålla användarens ID. Detta är allt databasen behöver veta om denna relation, ingen kolumn på User-sidan krävs. user.tokens är en ORM-abstraktion, den existerar inte som en kolumn.

För att lära dig mer om den kränkta begränsningen kan du antingen ansluta till databasen och undersöka tabellbegränsningarna, eller - om du använder migrationer - generera en migration och se hur den deklareras.