除了提供者之外,还有其他更优雅的方式在 Nest.js 中使用 Drizzle ORM 吗?例如,就像在 Prisma 和 PrismaService 中一样,我发现的只是像这样的提供商:
import { Module } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { drizzle } from 'drizzle-orm/postgres-js';
import postgres from 'postgres';
import * as schema from './schema';
export const PG_CONNECTION = "PG_CONNECTION"; // ignore that it is not separate file
@Module({
providers: [
{
provide: PG_CONNECTION,
inject: [ConfigService],
useFactory: async (config: ConfigService) => {
const connection = postgres(config.get("DATABASE_URL"));
return drizzle(connection, { schema });
},
},
],
exports: [PG_CONNECTION],
})
export class DrizzleModule {}
然后:
import { Inject, Injectable } from '@nestjs/common';
import { PG_CONNECTION } from '../drizzle/drizzle.module';
import { dbType } from 'drizzle-orm/postgres-js'; // ignore, it doesn't matter yet
import * as schema from '../drizzle/schema';
@Injectable()
export class UsersService {
constructor(@Inject(PG_CONNECTION) private drizzle: dbType<typeof schema>) {} // what I'm talking about
async findAll() {
return await this.drizzle.query.users.findMany();
}
}
我在说什么,我们应该每次都注入(提供者?),从数据库客户端导入常量和类型,而不是这样:
import { Inject, Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service'
@Injectable()
export class UsersService {
constructor(private prisma: PrismaService) {}
async findAll() {
return await this.prisma.users.findMany();
}
}
我试图找到解决方案,但似乎这个话题确实不受欢迎。我期待如此大的 Nest.js 和 Drizzle ORM 社区能够有一个很好的解决方案来将 Drizzle 与 Nest 一起使用
您可以围绕
PG_CONNECTION
注入令牌创建自己的包装类。类似的东西
@Injectable()
export class DrizzleService {
constructor(@Inject(PG_CONNECTION) readonly db: dbType<typeof schema>) {}
}
现在,您不再从
PG_CONNECTION
导出 DrizzleModule
令牌,而是导出 DrizzleService
。这将允许您使用类似的 private readonly drizzle: DrizzleService
,就像您可以使用 prisma
一样,然后访问 this.drizzle.db
以在其他提供者内部进行类型化数据库访问。