EntityMetadataNotFound:未找到 "Task" 的元数据 - NestJS

EntityMetadataNotFound: No metadata for "Task" was found - NestJS

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

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

我得到的错误

我的ORM配置文件:

**任务实体文件:**

最后我在tasks.module.ts文件中导入配置文件

遇到这个问题的人已经用不同的修复方法解决了它,

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

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

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

您的 Task class 上缺少 @Entity() 装饰器。这设置了 TypeORM 正在寻找的元数据 according to its docs.

您正在扩展 BaseEntity 这并不意味着它会将 @Entity 注释放置到您的实体 class。它基本上用于您希望每个实体都拥有的某些数据字段。

它的内部实现如下:-

// 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 字段 and/or 一个 createDateTime-, lastChangedDateTime-fields。

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

因此您必须在每个实体的开头放置 @Entity 注释 class

同时更改导入顺序,例如先导入 TypeOrmModule,然后再导入 TaskModule。

希望对您有所帮助。

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

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

typeorm.config.ts

对我有效

NestJS 中,在 .ts 旁边添加 .js 对我有用

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',
};

该错误是由打字稿引起的 如果你设置 typeOrmCOnfig 像这样

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

根据 typeOrm 官方文档 loading-all-entities-from-the-directory 使用 ts-node 时请小心使用此方法。 outDir 可能指向与放置实体的位置不同的 location/file,从而导致上述错误。您需要在 outDir 目录中指定 .js 文件的路径。

将实体设置为:

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

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

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

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

  autoLoadEntities: true,

这已解决问题。

像这样设置您的实体:

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