当前位置: 首页 > 知识库问答 >
问题:

找不到类型化实体元数据

红智鑫
2023-03-14

呵呵,

我试图使用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.

我的产品。实体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[];
}

我的产品订购了。实体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

我的应用程序。单元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 {}

我的打字机。配置。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}"],

和我的打字机一致。配置。ts并使用npm启动应用程序run start:dev将错误代码更改为

 TypeError: metatype is not a constructor

共有3个答案

墨翔宇
2023-03-14

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

@Module({
  imports: [TypeOrmModule.forFeature([Product, ProductToOrder])],
})
export class ProductModule {}
卢作人
2023-03-14

好吧,问题不是我的类型配置,也不是我的实体。

问题是我的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

冷英光
2023-03-14

在TypeORM配置中,您必须定义了实体属性:

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

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

 类似资料:
  • 问题内容: 我正在使用jackson库将JSON映射到对象中。我已经简化了问题 很多 ,这是发生了什么: 我正在解析一个空的JSON字符串: 在上,出现以下异常: 当我在类中有 两个 返回a的方法时,就会发生这种情况。删除其中一种方法不会导致异常。 实际上,我对映射器查看方法的事实感到惊讶,它应该设置我指示的字段。 这是怎么回事 问题答案: 我通过将转换为来解决此问题:

  • 我在我的tomcat日志中看到以下错误... 未找到 Java 类的邮件正文读取器和 Java 类型类“多部分”和“表”多部分“和”MIME 媒体类型多部分/表单数据“。与 MIME 媒体类型兼容的已注册邮件正文读取器包括:/ - 在客户端,我看到以下消息: 邮政https://dev.project.org/upload返回了415不支持的媒体类型的响应状态。 我已经搜索了一下,建议是球衣多部分

  • 问题内容: 我已经为此厌倦了很长时间。我不知道是什么原因导致此错误。这是我的文件: Uzytkownik.hbm.xml hibernate.cfg.xml: 我使用的是MySQL 5.5。 我收到以下错误: 这是我的课程:main.java Uzytkownik.java: HibernateUtil.java: 问题答案: 也许您的映射文件不完整,但其他方面应该是: =>需要设置完全合格的类名

  • 问题内容: 我正在尝试简单的Jersey + JSON示例,但出现以下错误 我放入以下jar文件以获得适当的结果 为什么会出现此类错误?错误日志在这里: web.xml JsonExample.java 和Json服务 如果我做错了事,请提出建议。 问题答案: 此问题已通过jersey-bundle-1.8.jar修复

  • 我在使用JAX-RS服务作为JSON时遇到了一些问题。

  • 我正在使用TypeORM和NestJs处理现有的MySql数据库。有一个共享表,我必须将记录插入其中,它有一个自动递增的主键。由于该表是共享的,因此已禁用“同步”。 当我使用@PrimaryGeneratedColumn装饰器设置TypeForm实体时,我得到一个错误,指出该列“没有默认值”。如果我将decorator更改为@Column,那么我将收到一个关于没有主键的错误。 谁能告诉我应该如何设