Express+TypeORM+Jest环境下User实体元数据未找到错误求助
解决Jest测试时TypeORM的EntityMetadataNotFoundError问题
可能的原因及解决方案
1. 实体导入方式错误
你的user.entity.ts使用了默认导出(export default User),但在app-data-source.ts中用了解构导入(import { User } from "./entity"),这会导致导入的User为undefined,TypeORM无法识别实体元数据。
修复方式:
- 如果
entity文件夹有index.ts,确保它正确导出实体:// entity/index.ts import User from './user.entity'; export { User }; - 或者直接修改
app-data-source.ts的导入语句为默认导入:// app-data-source.ts import User from "./entity/user.entity"; // 直接导入实体文件,而非文件夹
2. Jest测试未正确初始化DataSource
Postman运行时,你的应用会提前初始化AppDataSource,但Jest测试是独立执行的,可能在实体元数据加载完成前就调用了Repository。
修复方式:
创建Jest全局配置文件(如jest.setup.ts),确保测试前完成DataSource初始化:
// jest.setup.ts import { AppDataSource } from './src/app-data-source'; beforeAll(async () => { if (!AppDataSource.isInitialized) { await AppDataSource.initialize(); } }); afterAll(async () => { await AppDataSource.destroy(); // 测试结束后销毁连接,避免资源泄漏 });
然后在jest.config.js中配置:
module.exports = { preset: 'ts-jest', testEnvironment: 'node', setupFilesAfterEnv: ['./jest.setup.ts'], // 引入全局配置 transform: { '^.+\\.tsx?$': 'ts-jest', }, };
3. 实体配置改用路径扫描(更可靠)
直接导入实体容易出现模块解析问题,改用路径扫描让TypeORM自动加载实体:
// app-data-source.ts export const AppDataSource = new DataSource({ // ...其他配置 entities: [__dirname + '/entity/**/*.entity.ts'], // 扫描entity文件夹下所有实体文件 // 生产环境可改用编译后的js文件:entities: [__dirname + '/entity/**/*.entity.js'] });
4. 检查Jest的模块解析配置
确保Jest能正确解析TypeScript模块,在jest.config.js中添加:
module.exports = { // ...其他配置 moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], moduleNameMapper: { '^@/(.*)$': '<rootDir>/src/$1', // 如果使用了路径别名,需要对应配置 }, };
验证步骤
- 修复导入语句后,先单独运行
AppDataSource.initialize()测试是否能成功连接数据库 - 运行单个Jest测试,确认元数据错误是否消失
- 若仍有问题,打印
AppDataSource.entityMetadatas查看是否包含User实体的元数据
内容的提问来源于stack exchange,提问作者NewbieSolider
相关产品推荐
相关产品推荐

