NestJs集成TypeORM+PostgreSQL报错Driver not Connected求助
问题:TypeORM + NestJS 出现 "Driver not Connected" 错误
我正在搭建基于NestJs、TypeORM和PostgreSQL驱动的应用,已安装必要依赖(如"pg": "^8.11.0"及其他TypeORM相关包)。启动应用时synchronize: true能成功创建数据库表,但通过API操作数据库时出现TypeORMError: Driver not Connected错误。
配置文件
data-source.ts
import 'reflect-metadata'; import { DataSource } from 'typeorm'; export const AppDataSource = new DataSource({ type: 'postgres', url: process.env.DATABASE_URL, host: process.env.DATABASE_HOST, port: process.env.DATABASE_PORT ? parseInt(process.env.DATABASE_PORT, 10) : 5432, username: process.env.DATABASE_USERNAME, password: process.env.DATABASE_PASSWORD, database: process.env.DATABASE_NAME, synchronize: process.env.DATABASE_SYNCHRONIZE === 'true', dropSchema: false, // keepConnectionAlive: true, logging: process.env.NODE_ENV !== 'production', entities: ['src/modules/**/entity/*.entity.ts'], migrations: ['src/database/migrations/**/*.ts'], ssl: false, });
main.ts 相关代码
import { initializeTransactionalContext, addTransactionalDataSource, } from 'typeorm-transactional'; import { AppDataSource } from 'data-source'; async function bootstrap() { initializeTransactionalContext(); addTransactionalDataSource(AppDataSource); // ... 其他启动代码 } bootstrap();
app.module.ts 相关配置
@Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, load: [databaseConfig, appConfig], envFilePath: ['.env'], }), TypeOrmModule.forRootAsync({ useClass: TypeOrmConfigService, dataSourceFactory: async (options) => { return new DataSource(options).initialize(); }, }), UserModule, ], }) export class AppModule {}
错误信息
TypeORMError: Driver not Connected at PostgresDriver.obtainMasterConnection (/users/qwer/app-backend/src/driver/postgres/PostgresDriver.ts:1158:19) at PostgresQueryRunner.connect (/users/qwer/app-backend/src/driver/postgres/PostgresQueryRunner.ts:110:18) at PostgresQueryRunner.query (/users/qwer/app-backend/src/driver/postgres/PostgresQueryRunner.ts:244:47) at PostgresQueryRunner.startTransaction (/users/qwer/app-backend/src/driver/postgres/PostgresQueryRunner.ts:176:24) at processTicksAndRejections (node:internal/process/task_queues:95:5) at EntityManager.transaction (/users/qwer/app-backend/src/entity-manager/EntityManager.ts:153:13)
解决方案
核心问题是你创建了两个独立的DataSource实例:
data-source.ts中手动定义了AppDataSourceTypeOrmModule.forRootAsync里又通过new DataSource(options).initialize()创建了另一个实例
你在main.ts里给typeorm-transactional注册的是AppDataSource,但NestJS实际使用的是TypeOrmModule创建的数据源,导致事务操作时调用的是未初始化的AppDataSource,触发连接错误。
修复步骤:
- 修改
app.module.ts,复用已定义的AppDataSource,避免重复创建实例:
TypeOrmModule.forRootAsync({ useFactory: () => AppDataSource.options, dataSourceFactory: async () => { if (!AppDataSource.isInitialized) { await AppDataSource.initialize(); } return AppDataSource; }, }),
如果依赖TypeOrmConfigService提供配置,调整为:
TypeOrmModule.forRootAsync({ useClass: TypeOrmConfigService, dataSourceFactory: async (options) => { // 将配置合并到已有的AppDataSource Object.assign(AppDataSource.options, options); if (!AppDataSource.isInitialized) { await AppDataSource.initialize(); } return AppDataSource; }, }),
- 额外建议:不要同时设置
url和host/port/username/password/database,这可能导致配置冲突,优先保留DATABASE_URL一种配置方式更简洁。
内容的提问来源于stack exchange,提问作者nirvair
相关产品推荐
相关产品推荐

