使用 TypeOrm 找不到“用户”的元数据

rip*_*234 11 typeorm

我正在尝试使用 TypeORM进行基本设置,并在设置后收到此错误。

这是一个 REPL(只需执行yarn install && yarn db:dev以下操作yarn db:migrate && yarn start即可重现错误)

Inserting a new user into the database...
{ EntityMetadataNotFound: No metadata for "User" was found.
    at new EntityMetadataNotFoundError (/Users/admin/work/typeorm-naming-strategy/src/error/EntityMetadataNotFoundError.ts:9:9)
    at Connection.getMetadata (/Users/admin/work/typeorm-naming-strategy/src/connection/Connection.ts:313:19)
    at /Users/admin/work/typeorm-naming-strategy/src/persistence/EntityPersistExecutor.ts:77:55
    at Array.forEach (<anonymous>)
    at EntityPersistExecutor.<anonymous> (/Users/admin/work/typeorm-naming-strategy/src/persistence/EntityPersistExecutor.ts:71:30)
    at step (/Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:32:23)
    at Object.next (/Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:13:53)
    at /Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:7:71
    at new Promise (<anonymous>)
    at __awaiter (/Users/admin/work/typeorm-naming-strategy/node_modules/typeorm/persistence/EntityPersistExecutor.js:3:12)
  name: 'EntityMetadataNotFound',
  message: 'No metadata for "User" was found.' }
Run Code Online (Sandbox Code Playgroud)

小智 27

就我而言,我忘记将新实体(在您的情况下为 User )添加到 app.module.ts 。这是对我有用的解决方案:

// app.module.ts

@Module({
    imports: [
      TypeOrmModule.forRoot({
        ...
        entities: [User]
        ...
      }),
      ...
    ],
})
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,我也犯了同样的错误 (2认同)

Ish*_*mad 19

添加答案有点晚,但它是非常常见的错误。

上述错误有两个主要原因。在 OrmConfig 中,

  1. 您使用了 *.ts 而不是 *.js。例如,
entities: [__dirname + '/../**/*.entity.ts']  <-- Wrong
Run Code Online (Sandbox Code Playgroud)

它应该是

entities: [__dirname + '/../**/*.entity.js'] 
Run Code Online (Sandbox Code Playgroud)
  1. 实体路径错误。确保实体路径是根据 dist 文件夹而不是 src 文件夹定义的。

  • 实际上恰恰相反。.ts 是正确的,.js 是错误的。 (3认同)

小智 15

如果您的应用程序使用最新的 DataSource 而不是 OrmConfig (例如使用最新版本的 typeorm 的应用程序(我写这些行时为 0.3.1)),请确保initialize()在数据源中调用 DataSource 对象的方法。 ts 文件,然后再在应用程序中的任何位置使用它。


小智 12

问题出在 ormConfig

请尝试使用这个:

entities: [__dirname + '/../**/*.entity.{js,ts}']
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。请你解释一下这个路径 `__dirname + '/../**/*.entity.{js,ts}'` 的含义是什么 (2认同)
  • 当应用程序启动时,TS代码被转换为JS,因此TypeORM配置也被转换为JS,并且TypeORM无法读取它,除非您设置`entities`来读取JS和TS文件。这里使用的“{js,ts}”语法只是意味着读取任何带有“js”或“ts”后缀的文件。 (2认同)

小智 10

就我而言,我将一个 EmployeeSchema 更改为 EmployeeEntity,但我忘记了它的实体注释:

@Entity()
export class Employee {
Run Code Online (Sandbox Code Playgroud)


小智 5

以下将确保 TypeORM 使用的文件扩展名都是 .js 和 .ts

entities: [__dirname + '/../**/*.entity.{js,ts}']
Run Code Online (Sandbox Code Playgroud)

在你的配置文件中更改它。


小智 5

connection.connect()就我而言,我在创建连接后忘记使用方法,并在使用时遇到相同的错误manager.find()


小智 5

在 app.module.ts 中启用 autoLoadEntities

imports: [UserModule,
  TypeOrmModule.forRoot({
    autoLoadEntities: true
  })
]
Run Code Online (Sandbox Code Playgroud)


PR7*_*PR7 5

在使用实体之前,请确保您已与数据库建立连接。就我而言,我在AppDataSource初始化之前使用了它。这是我修复它的方法:

import "reflect-metadata";
import { DataSource } from "typeorm";
import { Season } from "src/models/Season";

const AppDataSource = new DataSource({
  type: "postgres",
  host: "localhost",
  port: 5432,
  username: "postgres",
  password: "postgres",
  database: "test-db",
  synchronize: false,
  logging: false,
  entities: [Season],
  migrations: [],
  subscribers: [],
});

AppDataSource.initialize()
  .then(async () => {
    console.log("Connection initialized with database...");
  })
  .catch((error) => console.log(error));

export const getDataSource = (delay = 3000): Promise<DataSource> => {
  if (AppDataSource.isInitialized) return Promise.resolve(AppDataSource);

  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (AppDataSource.isInitialized) resolve(AppDataSource);
      else reject("Failed to create connection with database");
    }, delay);
  });
};
Run Code Online (Sandbox Code Playgroud)

在您想要使用数据源的服务中:

import { getDataSource } from "src/config/data-source";
import { Season } from "src/models/Season";

const init = async (event) => {
  const AppDataSource = await getDataSource();
  const seasonRepo = AppDataSource.getRepository(Season);
  // Your business logic
};
Run Code Online (Sandbox Code Playgroud)

如果需要,您还可以扩展我的函数以添加重试逻辑:)


rip*_*234 1

我相信我的问题是由于意外同时拥有 ormconfig.json 和 ormconfig.ts 引起的

  • 哦,是的,它可能会对此感到困惑。如果显示 EntityMetadataNotFound,您就知道问题是您的实体尚未找到,否则,元数据将被加载。因此,从定义实体的地方开始 (2认同)