TypeORM生成迁移时报MissingDriverError驱动为undefined如何解决?
错误原因
- 你的
configuration.ts是适配NestJS ConfigModule的配置格式,导出的是返回配置对象的工厂函数,且TypeORM配置被嵌套在返回对象的database字段下。TypeORM CLI要求配置文件直接导出平级的TypeORM配置对象,无法识别嵌套结构和工厂函数,所以读取不到type字段,抛出驱动未定义错误。 - 你运行迁移命令时未提前加载环境变量,
process.env下的数据库配置为空也会导致参数读取异常。 - 配置中
migrations和migrationsDir路径写了绝对路径前缀/,会导致CLI找不到对应目录。
解决方案
方案一:新建CLI专用配置文件(更推荐,避免和业务配置耦合)
- 项目根目录新建
ormconfig.ts,内容如下:
import * as dotenv from 'dotenv'; // 加载根目录.env文件的环境变量 dotenv.config(); export default { type: 'mariadb', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT, 10), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: ['dist/**/*.entity{.ts,.js}'], synchronize: false, // 去掉绝对路径前缀 migrations: ['src/migration/**/*.ts'], keepConnectionAlive: true, charset: 'utf8mb4', cli: { migrationsDir: 'src/migrations', }, };
- 安装必要依赖:
npm install dotenv mysql --save # 若使用原生mariadb驱动可替换为npm install mariadb --save
- 修改
package.json中的脚本配置:
"typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js --config ormconfig.ts", "migration:generate":"npm run typeorm migration:generate -- -n"
方案二:修改现有配置文件适配CLI
如果不想单独维护配置文件,可修改src/config/configuration.ts:
import * as dotenv from 'dotenv'; import { join } from 'path'; dotenv.config(); // 单独导出平级的TypeORM配置供CLI调用 export const typeOrmConfig = { type: 'mariadb', host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT, 10), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: ['dist/**/*.entity{.ts,.js}'], synchronize: false, migrations: ['src/migration/**/*.ts'], keepConnectionAlive: true, charset: 'utf8mb4', cli: { migrationsDir: 'src/migrations', }, }; // 保留原有NestJS适配的配置导出 export default () => { return { database: typeOrmConfig, }; };
再修改package.json的typeorm脚本,指定读取的配置名称:
"typeorm": "node --require ts-node/register ./node_modules/typeorm/cli.js --config src/config/configuration.ts --config-name typeOrmConfig",
验证
修改完成后重新执行命令即可正常生成迁移文件:
npm run migration:generate -- softDeleteUser
内容的提问来源于stack exchange,提问作者Akash Sarkar
相关产品推荐
相关产品推荐

