Files
KIS-TOiR/backend/prisma-service.md
2026-03-15 17:29:37 +03:00

2.0 KiB

PrismaService Implementation

The generated backend must provide a NestJS injectable service that wraps PrismaClient. This document defines the only supported implementation for Prisma 5+.


Correct Implementation

import { Injectable, OnModuleInit } from "@nestjs/common";
import { PrismaClient } from "@prisma/client";

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect();
  }
}

Why this pattern

  • OnModuleInit: NestJS lifecycle hook; onModuleInit() runs when the module is initialized, ensuring the database connection is established before handling requests.
  • $connect(): Explicitly connects the Prisma client. Required for reliable connection handling in serverless or long-running apps.

Deprecated: Do NOT Use

The following pattern is deprecated in Prisma 5 and must not be generated:

// WRONG — do not generate
this.$on("beforeExit", async () => {
  await this.$disconnect();
});
  • beforeExit is not supported in Prisma 5.
  • Using it will cause runtime errors or warnings.

Rule for generators

Generated PrismaService (or equivalent) must:

  1. Extend PrismaClient.
  2. Implement OnModuleInit.
  3. Call await this.$connect() in onModuleInit().
  4. Not use this.$on('beforeExit', ...) or any beforeExit hook.

Module Registration

Register the service in a dedicated Prisma module (or in AppModule) so it can be injected into other services:

// prisma.module.ts (or app.module.ts)
import { Global, Module } from "@nestjs/common";
import { PrismaService } from "./prisma.service";

@Global()
@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

Using @Global() allows injecting PrismaService in any module without re-importing.


File location

Generated file:

  • src/prisma.prisma.service.ts or src/prisma.service.ts

Class name: PrismaService.