git init
This commit is contained in:
80
backend/prisma-service.md
Normal file
80
backend/prisma-service.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# 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
|
||||
|
||||
```typescript
|
||||
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:
|
||||
|
||||
```typescript
|
||||
// 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:
|
||||
|
||||
```typescript
|
||||
// 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`.
|
||||
Reference in New Issue
Block a user