TypeORM报Connection "default"未找到 无法向数据库发送请求
错误原因
当前使用的TypeORM 0.3+版本已移除全局默认连接自动注册逻辑,getRepository()这类全局方法不再能直接获取到你手动初始化的AppDataSource实例,因此抛出Connection "default" was not found错误。
你可以正常创建数据表是因为AppDataSource.initialize()本身执行成功,仅控制器层获取仓储的方式不符合新版本规范。
修复方案
方案1:通过自定义DataSource实例获取仓储(官方推荐)
直接引入你提前导出的AppDataSource实例,调用实例上的getRepository方法即可,完全不依赖全局连接,多数据源场景下也不会出现连接混淆问题。
修改控制器层代码如下:
import { Request, Response } from "express"; // 移除原typeorm包的getRepository引入,替换为引入自定义的数据源实例 import { AppDataSource } from "../database/Config"; import { User } from "../entities/User"; class UserController { async store(req: Request, res: Response) { // 从已初始化的数据源实例获取User表仓储 const repository = AppDataSource.getRepository(User); const { email, username, password } = req.body; const userExists = await repository.findOne({ where: { email } }); if (userExists) { return res.status(409).json('User already exists'); } const user = repository.create({ email, username, password }); await repository.save(user); return res.status(200).json(user); } } export default new UserController();
方案2:兼容旧版全局调用写法(不推荐)
如果需要兼容项目中大量getRepository的旧写法,可以在数据源初始化完成后手动将其注册为全局默认连接,该方案仅作过渡使用,后续TypeORM版本可能完全移除全局连接相关API。
在数据库配置的new DataSource参数中增加name: "default"字段即可。
注意事项
- 现有启动逻辑先初始化数据库再启动HTTP服务的写法是正确的,不会出现请求到达时数据库未完成连接的问题。
- 配置中的
synchronize: true仅适用于开发环境,生产环境必须关闭,否则可能触发自动表结构修改导致数据丢失。
内容的提问来源于stack exchange,提问作者Routfin
相关产品推荐
相关产品推荐

