Nestjs Swagger 4 的循环依赖

Circular Dependency with Nestjs Swagger 4

当我将 @nest/swagger 库更新到版本 4 时,出现了这个错误:

(node:16134) UnhandledPromiseRejectionWarning: Error: A circular dependency has been detected (property key: "customer"). Please, make sure that each side of a bidirectional relationships are using lazy resolvers ("type: () => ClassType").
    at SchemaObjectFactory.createNotBuiltInTypeReference (/opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:182:19)
    at SchemaObjectFactory.mergePropertyWithMetadata (/opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:117:25)
    at /opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:66:35
    at Array.map (<anonymous>)
    at SchemaObjectFactory.exploreModelSchema (/opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:65:52)
    at SchemaObjectFactory.createNotBuiltInTypeReference (/opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:187:37)
    at SchemaObjectFactory.mergePropertyWithMetadata (/opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:117:25)
    at /opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:66:35
    at Array.map (<anonymous>)
    at SchemaObjectFactory.exploreModelSchema (/opt/desenvolvimento/Haizen/projectx_back/node_modules/@nestjs/swagger/dist/services/schema-object-factory.js:65:52)

我的模型 class 似乎是这样的:

@Entity()
export class Job {
.
.
.
    @ManyToOne(type => Customer, customer => customer.jobs)
    @ApiProperty({ type: Customer })
    customer: Customer;
}

对我有用的解决方案是在 @ApiProperty() 中声明 type with arrow function,如下图:

@Entity()
export class Job {
.
.
.
    @ManyToOne(type => Customer, customer => customer.jobs)
    @ApiProperty({ type: () => Customer })
    customer: Customer;
}

对于同样遇到此问题的任何人,您可以将 type 键更改为 @ApiProperty 上的 enum 键。这对我有用。

至少在另外三种情况下您会收到相同的错误消息,即使它们与双向关系无关:

枚举类型

错误:

@ApiProperty({
    type: Salutation
})
public salutation: Salutation;

正确:

@ApiProperty({
    enum: Salutation
})
public salutation: Salutation;

匿名类型

错误:

@ApiProperty({
})
public address: {
    street: string;
    houseNumber: string;
};

正确:

@ApiProperty({
    type: Address
})
public address: Address;

错误:

@ApiProperty({
    description: 'This always returns null for downward compatibility'
})
public someLegacyField: null;

正确:

@ApiProperty({
    description: 'This always returns null for downward compatibility',
    type: String; // needed to avoid error
})
public someLegacyField: null;

我为此在 Github 上创建了一个问题:https://github.com/nestjs/swagger/issues/1475

我最近也遇到了这个问题。 就我而言,我在我的自定义验证文件夹中的同一个文件中使用了几个验证器。 “A circular dependency has been detected”的错误只出现在nest buildnode dist/main之后。

我不确定这是否是生成构建后 NestJs + Swagger 的问题。显然,我的解决方法是将验证器放入多个文件(每个文件包含 1 个验证器),它对我有用。

我在实体的嵌套属性上使用 type interfaces 时遇到了这个问题

不正确:

export class BookLikes {
  bookLikes: {
    user: User;
    book: Book;
  }[];
}

Nest.js 建议改用 类 - 即使在嵌套属性上也是如此:

正确:

export class BookLikes {
  bookLikes: BookLike[];
}

export class BookLike {
  user: User;
  book: Book;
}