You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeORM报错No metadata for "App" was found求助

解决TypeORM的EntityMetadataNotFoundError错误

问题场景

以下是我的代码配置:

  1. app-data-source.ts 数据源配置
import { DataSource } from "typeorm";
import { App } from "./entities/app";

export const appDataSource = new DataSource({
    type: 'postgres',
    host: process.env.CONFIG_DB_HOST,
    port: 5432,
    username: process.env.CONFIG_DB_USER,
    password: process.env.CONFIG_DB_PASSWORD,
    database: process.env.CONFIG_DB_DATABASE,
    entities: [App],
    synchronize: false,
});
  1. entities/app.ts App实体定义
import { Column, Entity, PrimaryColumn } from "typeorm";

@Entity('apps')
export class App {
    @PrimaryColumn()
    tenant_id: number;
    
    @Column()
    client_id: string;
    
    @Column()
    legacy_client_id: string;

    @Column()
    user_pool: string;
}
  1. AuthService 查询代码
import { App } from './entities/app';
import { appDataSource } from './app-data-source';

export class AuthService {
   async getApp() {
     let tenant=  await appDataSource.getRepository(App).findOneBy({
                client_id: clientId
            });
     }
}

运行时抛出错误:

{
    "errorMessage": "No metadata for \"App\" was found.",
    "errorType": "EntityMetadataNotFoundError",
    "stackTrace": [
        "EntityMetadataNotFoundError: No metadata for \"App\" was found.",
        "    at DataSource.getMetadata (D:\\lami-accounts\\dist\\apps\\auth\\main.js:181364:19)",
        "    at get metadata [as metadata] (D:\\lami-accounts\\dist\\apps\\auth\\main.js:185119:40)",
        "    at Repository.findOneBy (D:\\lami-accounts\\dist\\apps\\auth\\main.js:185312:44)",
        "    at AuthService.getAccessToken (D:\\lami-accounts\\dist\\apps\\auth\\main.js:57451:89)",
        "    at handler (D:\\lami-accounts\\dist\\apps\\auth\\main.js:32:27)"
    ]
}

解决方案

1. 确保DataSource完成初始化

TypeORM的DataSource必须调用initialize()方法完成初始化后才能使用,否则实体元数据不会被加载。

修改启动逻辑,比如在应用入口处:

// 应用入口文件示例
import { appDataSource } from './app-data-source';

async function bootstrap() {
  try {
    await appDataSource.initialize();
    console.log('数据源初始化成功');
    // 启动API服务或其他业务逻辑
  } catch (error) {
    console.error('数据源初始化失败:', error);
    process.exit(1);
  }
}

bootstrap();

也可以在AuthService中增加初始化检查:

export class AuthService {
   async getApp(clientId: string) {
     if (!appDataSource.isInitialized) {
       await appDataSource.initialize();
     }
     let tenant = await appDataSource.getRepository(App).findOneBy({
                client_id: clientId
            });
     return tenant;
   }
}

2. 检查实体配置路径

如果是TypeScript编译后运行,改用glob模式匹配实体文件,避免手动导入的路径问题:

export const appDataSource = new DataSource({
    // 其他配置保持不变
    // 匹配编译后的实体JS文件
    entities: [__dirname + '/entities/**/*.js'],
    // 开发环境可改用TS文件:
    // entities: process.env.NODE_ENV === 'development' ? [__dirname + '/entities/**/*.ts'] : [__dirname + '/entities/**/*.js'],
});

3. 确认TypeScript装饰器配置

检查tsconfig.json是否启用了装饰器相关选项,这是TypeORM生成元数据的必要条件:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    // 其他编译配置...
  }
}

4. 修复变量未定义问题

AuthService.getApp()方法中使用的clientId未作为参数传入,修正代码:

export class AuthService {
   // 接收clientId作为方法参数
   async getApp(clientId: string) {
     if (!appDataSource.isInitialized) {
       await appDataSource.initialize();
     }
     let tenant = await appDataSource.getRepository(App).findOneBy({
                client_id: clientId
            });
     return tenant;
   }
}

内容的提问来源于stack exchange,提问作者James Nganga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:51:52