【问题标题】:TypeORM Entity Metadata not found未找到 TypeORM 实体元数据
【发布时间】:2023-03-19 01:01:01
【问题描述】:

嘿嘿,

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

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

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.

我的 product.entity.ts:

import { BaseEntity, Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm";
import { ProductToOrder } from "./productToOrder.entity";

@Entity()
export class Product extends BaseEntity{
    @PrimaryGeneratedColumn()
    id: number;
    
    @Column()
    name: string;
    
    @Column()
    description: string;
    
    @Column()
    price: number;

    @OneToMany(type => ProductToOrder, productToOrder => productToOrder.product)
    productToOrders: ProductToOrder[];
}

我的 productToOrder.entity.ts

import { Order } from "src/order/order.entity";
import { BaseEntity, Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
import { Product } from "./product.entity";

@Entity()
export class ProductToOrder extends BaseEntity{
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    amount: number;

    @ManyToOne(() => Product, product => product.productToOrders,{eager: false})
    product: Product;

    @ManyToOne(() => Order, order => order.productToOrders, {eager: false})
    order: Order;
}

我的 order.entity.ts

import { User } from "src/auth/user.entity";
import { Product } from "src/product/product.entity";
import { ProductToOrder } from "src/product/productToOrder.entity";
import { BaseEntity, Column, Entity, JoinTable, ManyToMany, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm";

@Entity()
export class Order extends BaseEntity{
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    ordernumber: number;

    @Column()
    totalprice: number;
    
    @ManyToOne(type => User, user => user.orders, {eager: false})
    user_id: User[];

    @OneToMany(() => ProductToOrder, productToOrder => productToOrder.order, {eager: true})
    productToOrders: ProductToOrder[];
}

我的目录结构:

src/
├── order
│   ├── order.entity.ts
│   ├── order.module.ts
│   ├── order.service.ts
│   ├── order.controller.ts
│   └── order.repository.ts
├── product
│   ├── product.entity.ts
│   ├── product.module.ts
│   ├── product.service.ts
│   ├── product.controller.ts
│   ├── productToOrder.entity.ts <- i put the entity for the pivot table here, not sure if its right
│   └── product.repository.ts
└── xy

我的 app.module.ts

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from './auth/auth.module';
import { typeOrmConfig } from './config/typeorm.config';
import { ProductModule } from './product/product.module';
import { OrderModule } from './order/order.module';


@Module({
  imports: [
    TypeOrmModule.forRoot(typeOrmConfig),
    AuthModule,
    ProductModule,
    OrderModule,
  ],
  controllers: [],
  providers: [],
})
export class AppModule {}

我的 typeorm.config.ts

import { TypeOrmModuleOptions } from "@nestjs/typeorm";
import * as config from 'config';

const dbConfig = config.get('db');

export const typeOrmConfig: TypeOrmModuleOptions = {
    type: dbConfig.type,
    host: dbConfig.host,
    port: dbConfig.port,
    username: dbConfig.username,
    password: dbConfig.password,
    database: dbConfig.database,
    autoLoadEntities: true,
    synchronize: dbConfig.synchronize,
}

如果我添加了

entities: ["dist/**/*.entity{.ts,.js}"],

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

 TypeError: metatype is not a constructor

【问题讨论】:

    标签: typescript postgresql nestjs typeorm


    【解决方案1】:

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

    TypeOrmModule.forRoot({
      // ...
      entities: ['src/**/*.entity.ts']
    })
    

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

    【讨论】:

    • 我做到了,它也符合我的模式,现在我收到一个错误,说它不能在模块外使用 import 语句
    • 这是一个 TypeScript 问题,因为您的文件已构建,您可能必须使用带有 dist/ 目录的模式。
    • 试过了,我稍微改变了我的问题并添加了更多代码以使我更清楚
    • 老实说,我不确定您的解决方案是什么。我在我的项目中遇到了同样的问题,我最终使用了一个类数组而不是一个字符串模式来更好地处理“source vs. dist”的困境。所以我使用的不是entities: ['src/**/*.entity.ts']entities: [Product, Order, ProductOrder]。它让我确信我避免了这样的错误。明显的缺点是每次创建实体时都必须自己添加一个新实体。
    【解决方案2】:

    好的,所以问题不是我的 typeorm 配置,也不是我的实体。

    问题是我的 PassportJS 中间件。在我的 order.controller.ts 中

    看起来像这样:

    import { Body, Controller, Post, UseGuards, UsePipes, ValidationPipe } from '@nestjs/common';
    import { AuthGuard } from '@nestjs/passport';
    import { GetUser } from 'src/auth/get-user.decorator';
    import { User } from 'src/auth/user.entity';
    import { CreateOrderDto } from './dto/create-order.dto';
    import { OrderService } from './order.service';
    
    @Controller('order')
    @UseGuards(AuthGuard)
    export class OrderController {
        constructor(
            private orderService: OrderService,
        ){}
    
        @Post()
        @UsePipes(ValidationPipe)
        createProduct(
            @Body(ValidationPipe) createdto: CreateOrderDto,
            @GetUser() user: User,
        ){
            return this.orderService.createOrder(createdto, user);
        }
    }
    
    

    如您所见,我在

    中缺少括号
    @UseGuards(AuthGuard)
    

    装饰师。它应该是什么样子:

    @UseGuards(AuthGuard()) //<-- Missing brackets
    

    我在这里找到了这个解决方案的灵感: https://github.com/nestjs/nest/issues/2399

    【讨论】:

      【解决方案3】:

      也许您没有将 ProductToOrder 实体添加到 productModule?

      @Module({
        imports: [TypeOrmModule.forFeature([Product, ProductToOrder])],
      })
      export class ProductModule {}
      

      【讨论】:

        猜你喜欢
        • 2021-04-02
        • 2020-10-02
        • 2019-01-04
        • 2021-05-18
        • 2022-10-20
        • 2022-10-06
        • 2021-04-17
        • 1970-01-01
        • 2019-02-08
        相关资源
        最近更新 更多