插件窝 干货文章 如何在NestJS应用中使用@nestjs/config优雅地配置Prisma数据库?

如何在NestJS应用中使用@nestjs/config优雅地配置Prisma数据库?

PrismaService Prisma NestJS import 958    来源:    2025-03-23

在NestJS应用中使用@nestjs/config模块来优雅地配置Prisma数据库,可以按照以下步骤进行:

1. 安装依赖

首先,确保你已经安装了@nestjs/configprisma相关的依赖。

npm install @nestjs/config prisma @prisma/client

2. 创建Prisma配置文件

在项目根目录下创建一个.env文件,用于存储数据库连接字符串等环境变量。

DATABASE_URL="postgresql://user:password@localhost:5432/mydb"

3. 配置@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 {}

4. 创建Prisma服务

创建一个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();
  }
}

5. 使用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();
  }
}

6. 在模块中注册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 {}

7. 在其他服务中使用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();
  }
}

8. 运行Prisma迁移

最后,确保你已经运行了Prisma迁移来创建数据库表。

npx prisma migrate dev --name init

总结

通过以上步骤,你可以在NestJS应用中优雅地使用@nestjs/config模块来配置Prisma数据库。这种方式不仅使得配置更加灵活,还能确保数据库连接字符串等敏感信息通过环境变量进行管理,提高了应用的安全性。