Nestjs:使用没有类依赖注入的TypeOrm数据源



我有一个不寻常的请求。我们正在现有的express代码库中实现nestjs。之前,我们使用Typeorm 0.2并升级到0.3。我们使用的是函数而不是类,因此,如果没有大规模的重构,我们就无法使用数据源依赖注入目标是在不使用nestjs-dependecy注入的情况下使用数据源。

我们过去是这样构建交易的:

import { getManager } from 'typeorm';

return getManager().transaction((manager) => {
// do something
});

现在,对于TypeOrm 0.3,getManager已被弃用。代码正在编译,所有不包含getManager函数的请求都在工作。当包含它的函数被调用时,我得到以下错误:

ConnectionNotFoundError: Connection "default" was not found.

我试图直接使用数据源,但出现了臭名昭著的错误"元数据未找到";即将出现,而代码甚至没有编译。

import { getManager } from 'typeorm';
return AppDataSource.transaction((manager) => {
// do something
});
Entity metadata for BuyerIndustry#companies was not found. Check if you specified a correct entity object and if it's connected in the connection options.

这就是我们如何设置数据源并将其导入AppModule:

import { ConfigService } from '@nestjs/config';
import { DataSource } from 'typeorm';
import { repositories } from './repositories';
const configService = new ConfigService();
export const AppDataSource = new DataSource({
type: 'postgres',
host: configService.get('POSTGRES_HOST'),
port: configService.get('POSTGRES_PORT'),
username: configService.get('POSTGRES_USER'),
password: configService.get('POSTGRES_PASSWORD'),
database: configService.get('POSTGRES_DB'),
migrations: [__dirname + '/src/database/migrations/*{.ts,.js}'],
entities: repositories,
synchronize: false,
});
// repositories.ts
export const repositories = [
BuyerIndustry,
Company,
// and all other entities in the application
];
// typeorm.module.ts
import { Global, Module } from '@nestjs/common';
import { DataSource } from 'typeorm';
import { AppDataSource } from './datasource';
@Global()
@Module({
imports: [],
providers: [
{
provide: DataSource,
useFactory: async () => {
await AppDataSource.initialize();
return AppDataSource;
},
},
],
exports: [DataSource],
})
export class CustomTypeOrmModule {}
// main.module.ts
@Module({
imports: [
CustomTypeOrmModule,
// other modules
]
export class AppModule {
constructor(private dataSource: DataSource) {}
}

同样,我100%确信我导入了repositories.ts中的所有实体。有什么想法吗?我们如何在函数中直接使用DataSource,而不需要注入数据源的类?任何帮助都将不胜感激,谢谢!

首先确保AppDataSource已初始化。可以在main.ts文件中执行此操作

// main.ts
import {AppDataSource } from "..." // Your datasource file
if (!AppDataSource.isInitialized) {
await AppDataSource.initialize();
}

然后在任何类似的服务中调用它


const someRepo = AppDataSource.getRepository(SomeRepoEntity);
someRepo.findOne({where:{id:someId}})

最新更新