EntityMetadataNotFound:找不到“任务”的元数据 - NestJS

问题描述 投票:0回答:10

我正在学习 Udemy 的 NestJS 课程 https://www.udemy.com/course/nestjs-zero-to-hero

我遇到了一个奇怪的问题,我尝试了很多方法,但似乎没有任何效果。这是我的问题和完整代码。

我遇到的错误

Error that I am getting

我的ORM配置文件:

ORM Configuration file

**任务实体文件:** enter image description here

最后我在tasks.module.ts文件中导入配置文件 enter image description here

面临这个问题的人们已经通过不同的修复解决了它,

  1. 有人说我们可能在配置中添加了拼写错误的文件名或路径,这可能导致了此问题。
  2. 有人说从 npm 更改为yarn 已经解决了这个问题。
  3. 很少有人说问题出在 ORM 本身。

我已尝试了互联网上提供的所有可能的解决方案,但无法解决此问题。已经好几天了,我正在寻找堆栈溢出方面的帮助或救星。

同时,我会尝试查看更多可能有帮助的可能性,但如果您遇到此问题,请告诉我可能的解决方案。

javascript node.js orm nestjs typeorm
10个回答
26
投票
entities: [__dirname + '/../**/*.entity.ts']

entities: [__dirname + '/../**/*.entity.js']

typeorm.config.ts

对我有效


21
投票

您的

@Entity()
类中缺少
Task
装饰器。这设置了 TypeORM 正在寻找的元数据根据其文档


16
投票

NestJS 中添加

.js
并排
.ts
对我有用

typeorm.config.ts

之前

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const TypeORMConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  url: process.env.DATABASE_URL,
  synchronize: true,
  entities: [__dirname + '/../**/*.entity.ts'],
  migrationsTableName: 'Migrations_History',
};

之后

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

export const TypeORMConfig: TypeOrmModuleOptions = {
  type: 'postgres',
  url: process.env.DATABASE_URL,
  synchronize: true,
  entities: [__dirname + '/../**/*.entity{.ts,.js}'],
  migrationsTableName: 'Migrations_History',
};

9
投票

我也遇到过同样的问题。在尝试了此处提到的所有其他对我不起作用的解决方案后,我通过添加以下选项修改了 typeorm.config.ts 文件:

  autoLoadEntities: true,

这已经解决了问题。


4
投票

该错误是由打字稿引起的 如果您设置 typeOrmCOnfig 就像这样 enter image description here

编译后使用文件,即使用dist/*.js


2
投票

您正在扩展 BaseEntity,这并不意味着它将 @Entity 注释放置到您的实体类中。它的使用基本上就像您希望每个实体都拥有的某些数据字段一样。

它的内部实现如下所示:-

// base.entity.ts
import { PrimaryGeneratedColumn, Column, UpdateDateColumn, CreateDateColumn } from 'typeorm';

export abstract class BaseEntity {
@PrimaryGeneratedColumn('uuid')
id: string;

@Column({ type: 'boolean', default: true })
isActive: boolean;

@Column({ type: 'boolean', default: false })
isArchived: boolean;

@CreateDateColumn({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
createDateTime: Date;

@Column({ type: 'varchar', length: 300 })
createdBy: string;

@UpdateDateColumn({ type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' })
lastChangedDateTime: Date;

@Column({ type: 'varchar', length: 300 })
lastChangedBy: string;

@Column({ type: 'varchar', length: 300, nullable: true })
   internalComment: string | null;
}

因此这将生成一个 uuid id 字段和/或一个 createDateTime-、lastChangedDateTime 字段。

注意:这些基类应该是抽象的。

所以你必须在每个实体类的开头放置@Entity注释

还可以更改导入顺序,例如首先导入 TypeOrmModule,然后导入 TaskModule。

希望能有所帮助。


2
投票

    @Module({
  imports: [
    TasksModule,
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'postgres',
      database: 'userdata',
      autoLoadEntities: true,
      synchronize: true,

    }),
  ],
  
})
export class AppModule { }


0
投票

根据 typeOrm 官方文档 从目录加载所有实体在使用 ts-node 时要小心这种方法。 outDir 可能指向与实体所在位置不同的位置/文件,从而导致上述错误。您需要指定 outDir 目录中 .js 文件的路径。

将实体设置为:

entities: [__dirname + '../**/*.entity{.ts,.js}']

0
投票

像这样设置你的实体:

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

0
投票
In my case I add the Entity itself in DataSource entities array, and worked

import { Device } from "@core/entities/device";
import { User } from "@core/entities/user";

export const AppDataSource = new DataSource({
    type: "postgres",
    url: process.env.POSTGRES_URL_NON_POOLING,
    entities: [Device, User], // <-------- 
    logging: true,
});
© www.soinside.com 2019 - 2024. All rights reserved.