TypeORM集成TypeDI时出现ConnectionManager错误排查求助
看起来你遇到的核心问题是TypeORM在获取容器配置之前就尝试访问数据库连接了——虽然你调用了useContainer(Container),但调用时机或模块导入顺序不对,导致TypeORM没能正确使用TypeDI的容器来管理连接。下面是具体的排查步骤和解决方法:
1. 调整useContainer的调用时机(最关键修复)
在你的入口文件中,你先实例化了Server和Database,之后才调用useContainer。但模块导入是在代码执行前完成的,如果Server或Database内部导入了实体、仓库这类依赖TypeORM的模块,TypeORM会在你设置容器之前就完成初始化,自然找不到预设的连接。
修改入口文件的顺序,先配置容器,再导入任何依赖TypeORM的模块:
import './utils/env' import 'reflect-metadata' // 先导入容器相关模块 import { Container } from 'typedi' import { useContainer } from 'typeorm' // 必须在加载TypeORM相关模块前调用useContainer useContainer(Container) // 再导入依赖TypeORM的Server和Database import { Server } from './server' import { Database } from './database' import logger from './utils/logger' const server = new Server() const database = new Database() void database .connect() .then(() => { logger.info('Database connected') void server.listen().then((server) => { const { port } = server.address() as { port: number } logger.info(`Server started on port ${port}`) }) }) .catch((reason) => { throw new Error(`Database Error: ${reason as string}`) })
注意:这里要从typedi导入原生Container,而非typeorm-typedi-extensions的封装容器,避免版本兼容问题。
2. 确认仓库类的装饰器配置正确
你的UserRepository同时使用了@Service()和@EntityRepository(User),要确保装饰器配置无误:
import { Service } from 'typedi' import { EntityRepository, Repository } from 'typeorm' import { User } from './User' // 装饰器顺序不影响,但需确保两个都正确应用 @EntityRepository(User) @Service() export class UserRepository extends Repository<User> { // 你的自定义方法 }
另外,在UserService中使用@InjectRepository(User)时,要确保该装饰器来自typeorm-typedi-extensions:
import { Service } from 'typedi' import { InjectRepository } from 'typeorm-typedi-extensions' import UserRepository from '../entities/user/UserRepository' @Service() export default class UserService { @InjectRepository(User) private readonly userRepository: UserRepository // 你的服务方法 }
3. 检查Database类的连接逻辑
确保Database类的connect方法是在useContainer之后才执行,且连接配置中正确注册了所有实体:
示例Database类实现:
import { createConnection, Connection } from 'typeorm' import { User } from '../entities/user/User' export class Database { private connection?: Connection async connect(): Promise<Connection> { this.connection = await createConnection({ type: 'postgres', // 替换为你的数据库类型 host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT || '5432'), username: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, entities: [User], // 确保所有实体都在这里注册 synchronize: process.env.NODE_ENV !== 'production', logging: process.env.NODE_ENV === 'development', }) return this.connection } }
4. 确认依赖与编译配置
最后,确保安装了所有必要依赖且版本兼容:
npm install typeorm typedi typeorm-typedi-extensions typegraphql reflect-metadata
同时在tsconfig.json中启用必要编译选项:
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true, "target": "ES6", "module": "CommonJS" } }
按照这些步骤调整后,TypeORM应该能正确通过TypeDI容器获取连接,解决ManagerNotFoundError问题。
内容的提问来源于stack exchange,提问作者Keum Jung Bin

