未找到 TypeORM 实体元数据

Exo*_*Exo 6 postgresql typescript typeorm nestjs

嘿嘿,

\n

我正在尝试使用 NestJS + TypeORM 为某种类型的电子商务网站构建后端。

\n

我需要我的订单和产品表之间的 am:n 关系。然而,由于我需要数据透视表中的一些自定义字段,我查找了 typeorms 文档,并且如上所述,我需要创建一个我完成的新实体。现在我在启动 NestJS 应用程序时遇到错误:

\n
Error: Entity metadata for Product#productToOrders was not found. Check if you specified a correct entity object and if it\'s connected in the connection options.\n
Run Code Online (Sandbox Code Playgroud)\n

我的产品.entity.ts:

\n
Error: Entity metadata for Product#productToOrders was not found. Check if you specified a correct entity object and if it\'s connected in the connection options.\n
Run Code Online (Sandbox Code Playgroud)\n

我的productToOrder.entity.ts

\n
import { BaseEntity, Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";\nimport { ProductToOrder } from "./productToOrder.entity";\n\n@Entity()\nexport class Product extends BaseEntity{\n    @PrimaryGeneratedColumn()\n    id: number;\n    \n    @Column()\n    name: string;\n    \n    @Column()\n    description: string;\n    \n    @Column()\n    price: number;\n\n    @OneToMany(type => ProductToOrder, productToOrder => productToOrder.product)\n    productToOrders: ProductToOrder[];\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我的订单.entity.ts

\n
import { Order } from "src/order/order.entity";\nimport { BaseEntity, Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";\nimport { Product } from "./product.entity";\n\n@Entity()\nexport class ProductToOrder extends BaseEntity{\n    @PrimaryGeneratedColumn()\n    id: number;\n\n    @Column()\n    amount: number;\n\n    @ManyToOne(() => Product, product => product.productToOrders,{eager: false})\n    product: Product;\n\n    @ManyToOne(() => Order, order => order.productToOrders, {eager: false})\n    order: Order;\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

我的目录结构:

\n
src/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.entity.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.module.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.service.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.controller.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 order.repository.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.entity.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.module.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.service.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.controller.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 productToOrder.entity.ts <- i put the entity for the pivot table here, not sure if its right\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 product.repository.ts\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 xy\n
Run Code Online (Sandbox Code Playgroud)\n

我的app.module.ts

\n
import { User } from "src/auth/user.entity";\nimport { Product } from "src/product/product.entity";\nimport { ProductToOrder } from "src/product/productToOrder.entity";\nimport { BaseEntity, Column, Entity, JoinTable, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";\n\n@Entity()\nexport class Order extends BaseEntity{\n    @PrimaryGeneratedColumn()\n    id: number;\n\n    @Column()\n    ordernumber: number;\n\n    @Column()\n    totalprice: number;\n    \n    @ManyToOne(type => User, user => user.orders, {eager: false})\n    user_id: User[];\n\n    @OneToMany(() => ProductToOrder, productToOrder => productToOrder.order, {eager: true})\n    productToOrders: ProductToOrder[];\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

我的 typeorm.config.ts

\n
src/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.entity.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.module.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.service.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 order.controller.ts\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 order.repository.ts\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.entity.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.module.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.service.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 product.controller.ts\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 productToOrder.entity.ts <- i put the entity for the pivot table here, not sure if its right\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 product.repository.ts\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 xy\n
Run Code Online (Sandbox Code Playgroud)\n

如果我添加

\n
import { Module } from \'@nestjs/common\';\nimport { TypeOrmModule } from \'@nestjs/typeorm\';\nimport { AuthModule } from \'./auth/auth.module\';\nimport { typeOrmConfig } from \'./config/typeorm.config\';\nimport { ProductModule } from \'./product/product.module\';\nimport { OrderModule } from \'./order/order.module\';\n\n\n@Module({\n  imports: [\n    TypeOrmModule.forRoot(typeOrmConfig),\n    AuthModule,\n    ProductModule,\n    OrderModule,\n  ],\n  controllers: [],\n  providers: [],\n})\nexport class AppModule {}\n\n
Run Code Online (Sandbox Code Playgroud)\n

行到我的 typeorm.config.ts 并使用 npm run start:dev 启动应用程序,错误代码更改为

\n
 TypeError: metatype is not a constructor\n
Run Code Online (Sandbox Code Playgroud)\n

twi*_*kes 10

我收到了同样的错误,花了我几个小时来调试。最后,我@Entity()至少忘记了一个实体类。


Ter*_*oth 5

在您的 TypeORM 配置中,您必须定义以下entities属性:

TypeOrmModule.forRoot({
  // ...
  entities: ['src/**/*.entity.ts']
})
Run Code Online (Sandbox Code Playgroud)

检查该模式是否也与您的新实体匹配。

  • 老实说,我不确定您的解决方案是什么。我在项目中遇到了同样的问题,最终我使用类数组而不是字符串模式来更好地处理“源与分布”的困境。因此,我使用的不是“entities: ['src/**/*.entity.ts']”,而是:“entities: [Product, Order, ProductOrder]”。它让我确信我避免了这样的错误。明显的缺点是每次创建实体时都必须自己添加一个新实体。 (2认同)