You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例:

  1. data-source.ts中手动定义了AppDataSource
  2. TypeOrmModule.forRootAsync里又通过new DataSource(options).initialize()创建了另一个实例

你在main.ts里给typeorm-transactional注册的是AppDataSource,但NestJS实际使用的是TypeOrmModule创建的数据源,导致事务操作时调用的是未初始化的AppDataSource,触发连接错误。

修复步骤:

  1. 修改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;
  },
}),
  1. 额外建议:不要同时设置url和host/port/username/password/database,这可能导致配置冲突,优先保留DATABASE_URL一种配置方式更简洁。

内容的提问来源于stack exchange,提问作者nirvair

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 14:52:51