使用TypeORM+Express遇EntityMetadataNotFoundError问题求助
EntityMetadataNotFoundError 原因解析
这个错误的核心是TypeORM的数据源初始化是异步操作,具体逻辑如下:
AppDataSource.initialize()是一个异步方法,它需要完成实体元数据扫描、数据库连接建立等一系列操作才能就绪。你在回调外调用查询函数时,这个初始化过程还没完成,TypeORM还没把Photo实体的元数据加载到系统中,自然找不到对应元数据,抛出错误。- 而
initialize()的回调函数(或者await之后的代码)是在初始化完全完成后才执行的,此时所有实体元数据已经加载完毕,TypeORM能识别Photo实体,所以查询可以正常执行。
额外需要注意的TypeScript环境细节:
- 确认
Photo实体类正确添加了@Entity()装饰器,且在DataSource配置的entities数组中正确引入。TS编译后路径可能和源码不同,建议用__dirname配合相对路径(比如__dirname + '/entities/**/*.js'),或者在开发时使用glob模式(如src/entities/**/*.ts)。 - 如果你用的是TypeORM 0.3.x版本,DataSource配置里的
entities要直接传入实体类,而非字符串路径(或者配置entitiesDirs字段),否则会导致元数据加载失败。
错误与正确代码示例:
错误写法(回调外调用):
AppDataSource.initialize() .then(() => console.log("数据源初始化中")) .catch(err => console.error(err)); // 此时初始化未完成,调用查询会报错 const photoRepo = AppDataSource.getRepository(Photo); photoRepo.find();
正确写法(回调内执行):
AppDataSource.initialize() .then(() => { // 初始化完成后再执行查询 const photoRepo = AppDataSource.getRepository(Photo); photoRepo.find().then(photos => console.log(photos)); }) .catch(err => console.error(err));
或者用async/await更清晰的写法:
async function bootstrap() { // 等待数据源完全初始化 await AppDataSource.initialize(); // 执行查询 const photoRepo = AppDataSource.getRepository(Photo); const photos = await photoRepo.find(); console.log(photos); // 启动Express服务 app.listen(3000, () => console.log("服务启动")); } bootstrap();
内容的提问来源于stack exchange,提问作者slinger
相关产品推荐
相关产品推荐

