NestJS使用TypeORM连接Docker部署的Postgres报错如何解决
报错原因
共3个直接触发点,1个潜在隐患:
- 重复初始化TypeORM根配置:
StorageModule中已调用TypeOrmModule.forRoot(完整配置)完成数据源初始化,UsersModule中无参调用TypeOrmModule.forRoot()会触发第二个无配置数据源的初始化流程,因缺失驱动类型参数直接抛出Wrong driver: "undefined"错误。 - 缺少PostgreSQL驱动依赖:TypeORM本身不内置各数据库的驱动包,连接PostgreSQL依赖
pg包,未安装时会抛出this.postgres.Pool is not a constructor错误。 - 存在无效配置项:
StorageModule的TypeORM配置中driver: 'pg'为非法字段,type: 'postgres'已足够声明驱动类型,无效字段会干扰配置解析逻辑。 - 潜在隐患:PostgreSQL官方Docker镜像默认仅创建
postgres系统库,不会自动创建配置中指定的user_storage业务库,前置问题修复后会触发数据库不存在的连接错误。
修复方案
按以下步骤操作即可解决:
- 安装缺失的驱动依赖
npm install pg # 可选,安装TS类型提示,仅开发环境需要 npm install -D @types/pg
- 修正StorageModule配置
删除无效的driver字段,补充模块导出配置,确保全局只保留这一处forRoot调用:
import { Module } from '@nestjs/common'; import { storageConfig, StorageService } from './storage.service'; import { TypeOrmModule} from '@nestjs/typeorm' import { User } from './entities/user.entity'; @Module({ providers: [StorageService], imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: '172.17.0.3', port: 5432, username: 'admin', password: 'password', database: 'user_storage', schema: 'public', entities: [User], synchronize: true // 开发环境开启可自动同步表结构,生产环境必须关闭 }) ], exports: [TypeOrmModule] // 导出TypeOrmModule供其他业务模块使用 }) export class StorageModule {}
确认根模块AppModule已导入StorageModule。
3. 修正UsersModule的导入逻辑
删除无参的TypeOrmModule.forRoot()调用,改用forFeature注册当前模块需要用到的实体:
import { Module } from '@nestjs/common'; import { UsersService } from './users.service'; import { UsersController } from './users.controller'; import { TypeOrmModule } from '@nestjs/typeorm' import { User } from 'src/storage/entities/user.entity'; @Module({ imports: [TypeOrmModule.forFeature([User])], controllers: [UsersController], providers: [UsersService] }) export class UsersModule {}
- (推荐)优化Repository注入方式
无需手动从DataSource获取Repository,使用NestJS提供的装饰器注入更符合框架规范:
import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { UserRequest } from './user.models'; import { Repository } from 'typeorm' import { User } from 'src/storage/entities/user.entity'; @Injectable() export class UsersService { constructor(@InjectRepository(User) private readonly _users: Repository<User>) {} async create(req: UserRequest) { const user = this._users.create({ id: 1, name: req.name, age: req.age, address: req.address, notes: '' }) const savedUser = await this._users.save(user) return savedUser.id; } }
- 创建业务数据库
进入Postgres容器创建缺失的user_storage库:
# 进入容器内的psql交互终端 sudo docker exec -it postgre psql -U admin # 执行建库语句 CREATE DATABASE user_storage; # 输入\q退出终端 \q
完成以上步骤后重启项目,即可正常连接数据库。
内容的提问来源于stack exchange,提问作者Simple Fellow
相关产品推荐
相关产品推荐

