TypeORM搭配Jest运行报错:ormconfig已放根目录仍找不到连接配置
问题原因及解决方法
可能的原因1:TypeORM运行时工作目录与ormconfig.json所在目录不匹配
TypeORM自动查找配置文件时,默认读取进程运行的工作目录下的ormconfig文件,你可以在tests/setup.ts的beforeAll开头加一行代码确认工作目录:
console.log(process.cwd())
如果打印的路径不是你项目的根目录(和package.json同级的目录),就是工作目录不对导致的。
解决方法:
在jest.config.js中显式指定rootDir为项目根目录:
module.exports = { // 原有配置保留,新增下面这行 rootDir: '.', preset: "ts-jest", testEnvironment: "node", // 其他原有配置... }
可能的原因2:TypeORM版本为0.3.x+,已废弃ormconfig.json自动加载逻辑
TypeORM从0.3.0版本开始,不再支持自动读取ormconfig.json文件,官方改为推荐使用DataSource方式手动初始化连接。
解决方法:
要么降级到0.2.x版本,要么改用显式初始化的方式绕过自动读取逻辑:
// 直接导入你的ormconfig.json,手动选中test配置传入 import * as ormConfig from '../ormconfig.json' import { DataSource } from 'typeorm' let testDataSource: DataSource beforeAll(async () => { const testConfig = ormConfig.find(item => item.name === 'test') testDataSource = new DataSource(testConfig) await testDataSource.initialize() })
可能的原因3:存在优先级更高的ORM配置覆盖了json文件
TypeORM加载配置的优先级为:环境变量指定的配置路径 > ormconfig.env > ormconfig.js > ormconfig.ts > ormconfig.json,如果你项目根目录下有更高优先级的同名配置文件,或者环境变量中配置了TYPEORM_CONFIG指向其他路径,都会导致json配置不被读取。
解决方法:
删除根目录下其他ormconfig前缀的配置文件,检查环境变量中是否有TYPEORM相关的配置项,清空后重试。
临时绕过方案(最稳妥)
不管是什么原因导致的自动读取失败,都可以直接手动导入配置传入初始化方法,完全绕过TypeORM的自动查找逻辑,修改你的tests/setup.ts代码即可:
import { createConnection, getConnection } from "typeorm"; // 相对路径根据你的文件位置调整,确保能读到根目录的ormconfig.json import * as ormConfig from '../ormconfig.json' beforeAll(async () => { const testConfig = ormConfig.find(conn => conn.name === 'test') await createConnection(testConfig); }); // 其他原有逻辑保留
额外注意:你的test连接配置里有拼写错误,
synchroize少了一个n,正确属性名是synchronize,后续配置生效后会因为这个属性不识别报错,记得提前修改。
内容的提问来源于stack exchange,提问作者Arman

