You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者Вадим Иващенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:57:15