TypeScript+Express+TypeORM应用报错:connection default was not found
解决TypeORM 'connection default was not found' 错误
嘿,我来帮你搞定这个TypeORM连接的问题!这个错误本质上是因为你在TypeORM完成数据库连接初始化之前,就调用了getManager()或者getConnection()这类需要依赖已建立连接的方法,所以系统找不到名为default的连接。
下面是具体的解决步骤,结合你的代码来调整:
1. 先确保TypeORM连接在应用启动时完成初始化
TypeORM的连接建立是异步操作,所以你得在启动Express服务器之前,先等待连接完成。比如在你的应用入口文件(比如index.ts)里这么写:
import { createConnection } from "typeorm"; import express from "express"; // 启动函数用async/await处理异步连接 async function bootstrap() { try { // 先初始化TypeORM连接,这一步会读取你的orm配置(ormconfig.json或data-source.ts) await createConnection(); console.log("✅ TypeORM数据库连接成功"); // 连接成功后再启动Express服务 const app = express(); // 这里放你的中间件、路由配置等 const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`🚀 服务器运行在 http://localhost:${PORT}`); }); } catch (error) { console.error("❌ TypeORM连接失败:", error); // 连接失败直接退出进程,避免服务异常运行 process.exit(1); } } // 启动应用 bootstrap();
如果你用的是TypeORM 0.3+版本,推荐使用DataSource来初始化:
import { DataSource } from "typeorm"; import express from "express"; import { Leave } from "./entities/Leave"; // 导入你的实体 // 定义数据源 export const AppDataSource = new DataSource({ type: "mysql", // 换成你的数据库类型(postgres/sqlite/mssql等) host: "localhost", port: 3306, username: "your-db-username", password: "your-db-password", database: "your-db-name", entities: [Leave], // 注册你的实体 synchronize: true, // 开发环境可用,生产环境建议关闭 logging: false, }); async function bootstrap() { try { await AppDataSource.initialize(); console.log("✅ TypeORM数据库连接成功"); const app = express(); // 配置中间件和路由 app.listen(3000); } catch (error) { console.error("❌ 连接失败:", error); process.exit(1); } } bootstrap();
2. 修改你的LeaveDataService,避免在构造函数中直接获取连接
你的构造函数是同步执行的,而连接初始化是异步的,这就导致构造函数执行时连接还没建立,所以getManager()会报错。这里有两种改进方式:
方式一:通过构造函数注入EntityManager(推荐,符合依赖注入思想)
import { Repository, EntityManager } from "typeorm"; import { Leave } from "./entities/Leave"; export class LeaveDataService { private _db: Repository<Leave>; // 从外部传入EntityManager,这样我们不用在服务内部处理连接逻辑 constructor(private readonly entityManager: EntityManager) { this._db = entityManager.getRepository(Leave); } /** * 申请休假 */ async applyLeave(leaveData: Partial<Leave>) { return this._db.save(leaveData); } }
然后在使用这个服务的地方(比如路由里),确保连接已经初始化后再实例化服务:
import { getManager } from "typeorm"; import { LeaveDataService } from "./LeaveDataService"; app.post("/leave/apply", async (req, res) => { try { // 连接已经初始化,所以可以安全获取EntityManager const manager = getManager(); const leaveService = new LeaveDataService(manager); const result = await leaveService.applyLeave(req.body); res.status(200).json({ success: true, data: result }); } catch (error) { res.status(500).json({ success: false, message: "申请失败", error }); } });
方式二:在服务方法中异步获取仓库(快速修复方案)
如果不想改太多代码,可以把获取仓库的逻辑放到异步方法里,确保连接已经建立:
import { Repository, getManager } from "typeorm"; import { Leave } from "./entities/Leave"; export class LeaveDataService { private async getRepository(): Promise<Repository<Leave>> { // 这里await确保连接已初始化(其实如果bootstrap里已经等过连接,这里可以不用await,但加上更安全) const manager = await getManager(); return manager.getRepository(Leave); } /** * 申请休假 */ async applyLeave(leaveData: Partial<Leave>) { const db = await this.getRepository(); return db.save(leaveData); } }
3. 检查你的TypeORM配置文件
确保你的配置文件(ormconfig.json或data-source.ts)里的连接名称是default(TypeORM默认查找这个名称的连接),或者在初始化连接时指定正确的连接名称。比如ormconfig.json:
{ "type": "mysql", "host": "localhost", "port": 3306, "username": "root", "password": "password", "database": "leave_system", "entities": ["src/entities/**/*.ts"], "synchronize": true, "name": "default" // 这个可以省略,因为默认就是default }
总结一下:核心就是先确保TypeORM连接完全建立,再去调用任何需要连接的方法,同时避免在同步的构造函数里直接获取连接相关的对象。
内容的提问来源于stack exchange,提问作者Joseph Izang
相关产品推荐
相关产品推荐

