在NestJS应用中使用@nestjs/config
模块来优雅地配置Prisma数据库,可以按照以下步骤进行:
首先,确保你已经安装了@nestjs/config
和prisma
相关的依赖。
npm install @nestjs/config prisma @prisma/client
在项目根目录下创建一个.env
文件,用于存储数据库连接字符串等环境变量。
DATABASE_URL="postgresql://user:password@localhost:5432/mydb"
@nestjs/config
模块在app.module.ts
中导入ConfigModule
,并配置它来加载环境变量。
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { PrismaService } from './prisma.service';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // 使配置全局可用
envFilePath: '.env', // 指定.env文件路径
}),
],
providers: [PrismaService],
})
export class AppModule {}
创建一个PrismaService
,用于管理Prisma客户端的生命周期。
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
await this.$connect();
}
async onModuleDestroy() {
await this.$disconnect();
}
}
ConfigService
获取数据库连接字符串在PrismaService
中使用ConfigService
来获取数据库连接字符串。
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
constructor(private configService: ConfigService) {
super({
datasources: {
db: {
url: configService.get<string>('DATABASE_URL'),
},
},
});
}
async onModuleInit() {
await this.$connect();
}
async onModuleDestroy() {
await this.$disconnect();
}
}
PrismaService
确保PrismaService
在模块中注册,以便在其他服务或控制器中使用。
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { PrismaService } from './prisma.service';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: '.env',
}),
],
providers: [PrismaService],
exports: [PrismaService], // 导出PrismaService以便在其他模块中使用
})
export class AppModule {}
PrismaService
现在你可以在其他服务或控制器中注入PrismaService
来使用Prisma客户端。
import { Injectable } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Injectable()
export class UserService {
constructor(private prisma: PrismaService) {}
async findAll() {
return this.prisma.user.findMany();
}
}
最后,确保你已经运行了Prisma迁移来创建数据库表。
npx prisma migrate dev --name init
通过以上步骤,你可以在NestJS应用中优雅地使用@nestjs/config
模块来配置Prisma数据库。这种方式不仅使得配置更加灵活,还能确保数据库连接字符串等敏感信息通过环境变量进行管理,提高了应用的安全性。