如何在NestJS中创建自定义仓库?DataSource获取方法咨询
TypeORM自定义仓库获取DataSource的正确实现
方法一:从已初始化的数据源实例中扩展仓库
首先确保你有一个配置并初始化好的数据源文件(比如data-source.ts):
import { DataSource } from "typeorm"; import { User } from "./entities/user.entity"; // 定义并导出数据源实例 export const AppDataSource = new DataSource({ type: "mysql", // 根据你的数据库类型调整(postgres/sqlite等) host: "localhost", port: 3306, username: "your_username", password: "your_password", database: "your_db", entities: [User], synchronize: true, logging: false, }); // 初始化数据源 AppDataSource.initialize() .then(() => console.log("数据源初始化完成")) .catch(err => console.error("数据源初始化失败", err));
然后在user.repositories.ts中导入这个已定义的数据源实例,直接扩展仓库:
import { AppDataSource } from '../data-source'; import { User } from '../entities/user.entity'; export const UserRepository = AppDataSource.getRepository(User).extend({ // 自定义方法示例 findByName(firstName: string, lastName: string) { return this.createQueryBuilder("user") .where("user.firstName = :firstName", { firstName }) .andWhere("user.lastName = :lastName", { lastName }) .getMany(); }, });
注意:必须在AppDataSource完成初始化后再使用UserRepository,比如在服务/控制器中导入使用时,确保数据源已经完成初始化。
方法二:通过工厂函数创建仓库(类型更安全)
如果需要更明确的类型定义,可以用工厂函数封装仓库创建逻辑:
在user.repositories.ts中:
import { DataSource, Repository } from 'typeorm'; import { User } from '../entities/user.entity'; // 定义自定义仓库的类型 export type UserRepositoryType = Repository<User> & { findByName(firstName: string, lastName: string): Promise<User[]>; }; // 工厂函数:接收数据源实例,返回自定义仓库 export function createUserRepository(dataSource: DataSource): UserRepositoryType { return dataSource.getRepository(User).extend({ findByName(firstName: string, lastName: string) { return this.createQueryBuilder("user") .where("user.firstName = :firstName", { firstName }) .andWhere("user.lastName = :lastName", { lastName }) .getMany(); }, }); }
然后在data-source.ts中初始化后导出仓库:
import { createUserRepository } from './repositories/user.repositories'; // ... 数据源定义和初始化代码 export const UserRepository = createUserRepository(AppDataSource);
这种方式可以避免因数据源未初始化导致的提前引用问题,同时类型提示更清晰。
内容的提问来源于stack exchange,提问作者Вадим Иващенко
相关产品推荐
相关产品推荐

