NestJS集成TypeORM无法自动生成迁移文件问题求助
NestJS + TypeORM 迁移文件生成失败:找不到data-source.ts文件
我正在开发第一个基于TypeORM的NestJS应用,无法自动生成包含up()和down()方法的迁移文件。运行npm run migration:generate命令时,出现找不到data-source.ts文件的错误,相关配置与错误信息如下:
package.json 脚本配置
{ "scripts": { "typeorm": "typeorm-ts-node-commonjs", "schema:sync": "npx typeorm-ts-node-commonjs schema:sync", "typeorm:cache": "npx typeorm-ts-node-commonjs cache:clear", "schema:drop": "npx typeorm-ts-node-commonjs -d ./src/data/data-source.ts", "migration:create": "typeorm migration:create ./src/data/migrations/schema-update", "migration:generate": "npx typeorm-ts-node-commonjs migration:generate ./src/data/migrations/schema-update -d ./src/database/data-source.ts", "migration:show": "npx typeorm-ts-node-commonjs migration:show -d ./src/data/data-source.ts", "migration:run": "npx typeorm-ts-node-commonjs migration:run -d ./src/data/data-source.ts", "migration:revert": "npx typeorm-ts-node-commonjs migration:revert -d ./src/data/data-source.ts" }, "dependencies": { "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.2.3", "@nestjs/core": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/typeorm": "^10.0.2", "mysql2": "^3.11.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", "typeorm": "^0.3.20" }, "devDependencies": { "@nestjs/cli": "^10.0.0", "@nestjs/schematics": "^10.0.0", "@nestjs/testing": "^10.0.0", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/node": "^20.3.1", "@types/supertest": "^6.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/parser": "^8.0.0", "eslint": "^8.42.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.5.0", "prettier": "^3.0.0", "source-map-support": "^0.5.21", "supertest": "^7.0.0", "ts-jest": "^29.1.0", "ts-loader": "^9.4.3", "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", "typescript": "^5.1.3" } }
data-source.ts(路径:src/data/data-source.ts)
import { DataSource } from 'typeorm'; import * as dotenv from 'dotenv'; dotenv.config(); const AppDataSource = new DataSource({ type: 'mysql', host: 'localhost', port: Number(process.env.DB_PORT), username: process.env.DB_USERNAME, password: process.env.DB_PASSWORD, database: process.env.DB_DATABASE, entities: ['src/data/entities/*.entity{.ts}'], migrations: ['src/data/migrations/*{.ts,.js}'], synchronize: false, dropSchema: false, logging: true, logger: 'file', subscribers: ['src/data/subscribers/**/*.ts'], migrationsTableName: 'migration_table', }); export default AppDataSource;
app.module.ts
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule, ConfigService } from '@nestjs/config'; import AppDataSource from './data/data-source'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), TypeOrmModule.forRoot(AppDataSource.options), TypeOrmModule.forRootAsync({ imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get('DB_HOST'), port: configService.get('DB_PORT'), username: configService.get('DB_USERNAME'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_DATABASE'), entities: ['dist/**/*.entity{.ts,.js}'], synchronize: false, autoLoadEntities: true, migrations: [__dirname + '/data/migrations/**/*{.ts,.js}'], seeds: [__dirname + '/data/seeds/**/*{.ts,.js}'], factories: [__dirname + '/factories/**/*{.ts,.js}'], cli: { migrationsDir: __dirname + '/data/migrations/', }, }), inject: [ConfigService], }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
错误信息
> backend@0.0.1 migration:generate > npx typeorm-ts-node-commonjs migration:generate ./src/data/migrations/schema-update -d ./src/databasedata/data-source.ts Error during migration generation: Error: Unable to open file: "D:\project\backend\src\database\data-source.ts". Cannot find module 'D:\project\backend\src\database\data-source.ts' Require stack: - D:\project\node_modules\typeorm\util\ImportUtils.js - D:\project\node_modules\typeorm\commands\CommandUtils.js - D:\project\node_modules\typeorm\commands\SchemaSyncCommand.js - D:\project\node_modules\typeorm\cli.js - D:\project\node_modules\typeorm\cli-ts-node-commonjs.js at Function.loadDataSource (D:\project\node_modules\src\commands\CommandUtils.ts:22:19) at async Object.handler (D:\project\node_modules\src\commands\MigrationGenerateCommand.ts:78:26) npm error Lifecycle script `migration:generate` failed with error: npm error code 1
项目结构
project: - frontend - backend
我已经在main.ts中引入了import "reflect-metadata",求解决这个问题。
解决方案
1. 修复脚本路径笔误
从错误信息可见,migration:generate脚本里的数据源路径写成了./src/database/data-source.ts(实际是database和data连写的笔误),而你的文件实际路径是./src/data/data-source.ts。修改package.json中的对应脚本:
"migration:generate": "npx typeorm-ts-node-commonjs migration:generate ./src/data/migrations/schema-update -d ./src/data/data-source.ts",
2. 移除重复的TypeORM配置
你的app.module.ts中同时使用了TypeOrmModule.forRoot(AppDataSource.options)和TypeOrmModule.forRootAsync,会导致配置冲突,保留异步配置即可(它能正确读取环境变量):
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ConfigModule, ConfigService } from '@nestjs/config'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), TypeOrmModule.forRootAsync({ imports: [ConfigModule], useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get('DB_HOST'), port: configService.get('DB_PORT'), username: configService.get('DB_USERNAME'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_DATABASE'), entities: ['dist/**/*.entity{.ts,.js}'], synchronize: false, autoLoadEntities: true, migrations: [__dirname + '/data/migrations/**/*{.ts,.js}'], seeds: [__dirname + '/data/seeds/**/*{.ts,.js}'], factories: [__dirname + '/factories/**/*{.ts,.js}'], cli: { migrationsDir: 'src/data/migrations/', }, }), inject: [ConfigService], }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
3. 确保环境变量配置正确
确认backend目录下存在.env文件,且包含完整的数据库配置:
DB_HOST=localhost DB_PORT=3306 DB_USERNAME=你的数据库用户名 DB_PASSWORD=你的数据库密码 DB_DATABASE=你的数据库名
4. 重新生成迁移
修改完成后,先清除TypeORM缓存,再运行生成命令:
npm run typeorm:cache npm run migration:generate
内容的提问来源于stack exchange,提问作者Amir Latif
相关产品推荐
相关产品推荐

