TypeORM报错No metadata for "App" was found求助
解决TypeORM的EntityMetadataNotFoundError错误
问题场景
以下是我的代码配置:
- 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, });
- 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; }
- 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
相关产品推荐
相关产品推荐

