NestJS新版TypeORM下如何在非可注入文件访问DataSource?
非注入方式访问新版TypeORM的DataSource
在NestJS集成的新版TypeORM(基于DataSource而非旧版EntityManager)中,你可以通过以下两种常见方式在非注入场景(比如工具类、普通函数)中访问DataSource:
方法1:从Nest应用容器中获取
Nest启动后,TypeORM的DataSource实例会被自动注册到应用容器中。你可以在应用初始化时获取并导出这个实例,供全局使用:
- 在
main.ts中获取并导出DataSource:
import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { DataSource } from 'typeorm'; // 全局导出DataSource实例 export let appDataSource: DataSource; async function bootstrap() { const app = await NestFactory.create(AppModule); // 从容器中获取已初始化的DataSource appDataSource = app.get(DataSource); await app.listen(3000); } bootstrap();
- 在任意文件中直接导入使用:
// 示例:工具类文件 import { appDataSource } from '../main'; export async function fetchRecentPosts() { // 创建查询构建器 const posts = await appDataSource .createQueryBuilder() .select('post') .from(Post, 'post') .where('post.createdAt > :date', { date: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000) }) .getMany(); return posts; }
方法2:手动初始化并导出独立的DataSource
如果你不需要依赖Nest的DI容器,可以直接按照TypeORM原生方式创建DataSource实例,独立初始化后全局导出:
- 创建
data-source.ts文件,定义并初始化DataSource:
import { DataSource } from 'typeorm'; import { Post } from './entities/post.entity'; import { User } from './entities/user.entity'; export const AppDataSource = new DataSource({ type: 'mysql', // 根据你的数据库类型调整 host: 'localhost', port: 3306, username: 'root', password: 'your-password', database: 'nest_db', entities: [Post, User], // 注册你的实体类 synchronize: process.env.NODE_ENV !== 'production', logging: false, }); // 初始化DataSource AppDataSource.initialize() .then(() => { console.log('独立DataSource初始化完成'); }) .catch(err => { console.error('独立DataSource初始化失败:', err); });
- 在任意文件中导入使用:
// 示例:普通函数文件 import { AppDataSource } from '../data-source'; import { User } from '../entities/user.entity'; export async function getUserById(userId: number) { return AppDataSource.getRepository(User).findOneBy({ id: userId }); }
注意事项
- 方法1更贴合NestJS的集成逻辑,避免重复初始化
DataSource,但必须等待Nest应用启动完成后才能使用。 - 方法2是独立于Nest的原生用法,适合不需要Nest上下文的场景,但要确保不要和Nest中
TypeORMModule.forRoot()初始化的DataSource重复配置,否则会创建多个数据库连接。
内容的提问来源于stack exchange,提问作者RanST
相关产品推荐
相关产品推荐

