Articles
Aug 25, 2024

Utilisation de Prisma avec NestJS : Un Guide Complet

Requêter une base de données n'a jamais été aussi simple

Utilisation de Prisma avec NestJS : Un Guide Complet

NestJS est un framework progressif pour construire des applications backend Node.js efficaces et évolutives, en utilisant TypeScript.

Prisma, de son côté, est un ORM (Object-Relational Mapping) moderne et performant qui simplifie les interactions avec la base de données tout en offrant un typage complet avec TypeScript.

Sans Prisma

import { createConnection } from 'mysql2/promise';

async function getUsersWithPostsAndComments() {
  const connection = await createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'mydb'
  });

  const [rows] = await connection.execute(`
    SELECT 
      users.id as userId, users.name as userName, 
      posts.id as postId, posts.title as postTitle,
      comments.id as commentId, comments.text as commentText
    FROM users
    LEFT JOIN posts ON users.id = posts.userId
    LEFT JOIN comments ON posts.id = comments.postId
  `);

  const result = rows.reduce((acc, row) => {
    const user = acc.find(u => u.id === row.userId);
    if (!user) {
      acc.push({
        id: row.userId,
        name: row.userName,
        posts: row.postId ? [{
          id: row.postId,
          title: row.postTitle,
          comments: row.commentId ? [{
            id: row.commentId,
            text: row.commentText
          }] : []
        }] : []
      });
    } else {
      const post = user.posts.find(p => p.id === row.postId);
      if (!post) {
        user.posts.push({
          id: row.postId,
          title: row.postTitle,
          comments: row.commentId ? [{
            id: row.commentId,
            text: row.commentText
          }] : []
        });
      } else if (row.commentId) {
        post.comments.push({
          id: row.commentId,
          text: row.commentText
        });
      }
    }
    return acc;
  }, []);

  await connection.end();
  
  return result;
}

Avec Prisma

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

async function getUsersWithPostsAndComments() {
  const users = await prisma.user.findMany({
    include: {
      posts: {
        include: {
          comments: true
        }
      }
    }
  });
  return users;
}

Utiliser Prisma avec NestJS est une combinaison puissante pour le développement d’applications backend robustes et maintenables.

Cet article vous guide à travers les étapes pour intégrer Prisma dans une application NestJS.

1. Pourquoi choisir Prisma avec NestJS ?

Prisma simplifie grandement la gestion des bases de données grâce à son générateur de requêtes type-safe, à sa migration de schéma simple et à son introspection de base de données. Avec NestJS, vous bénéficiez de la structure modulaire, des décorateurs et de l'injection de dépendances qui facilitent la maintenance de votre code.

2. Pré-requis

Avant de commencer, assurez-vous d’avoir les éléments suivants installés sur votre machine :

  • Node.js (version 14 ou supérieure)
  • Nest CLI (npm install -g @nestjs/cli)
  • Une base de données (MySQL, PostgreSQL, SQLite, etc.)

3. Création d’un projet NestJS

Commencez par créer un nouveau projet NestJS avec la CLI :

nest new project-name

Naviguez ensuite dans le répertoire du projet :

cd project-name

4. Installation de Prisma

Installez Prisma et son client via npm :

npm install prisma --save-dev
npm install @prisma/client

Ensuite, initialisez Prisma dans votre projet :

npx prisma init

Cette commande crée un fichier prisma/schema.prisma qui est le point central pour définir le modèle de données et configurer la connexion à la base de données.

5. Configuration de Prisma

Ouvrez le fichier prisma/schema.prisma et configurez-le selon votre base de données. Par exemple, pour PostgreSQL :


datasource db {
    provider = "postgresql"
    url      = env("DATABASE_URL")
  }
  
  generator client {
    provider = "prisma-client-js"
  }
  
  model User {
    id        Int      @id @default(autoincrement())
    email     String   @unique
    name      String?
    createdAt DateTime @default(now())
    updatedAt DateTime @updatedAt
  }

Ajoutez l’URL de connexion à la base de données dans le fichier .env :

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

6. Génération du Client Prisma

Une fois que votre modèle est défini, générez le client Prisma pour que vos modifications soient prises en compte :

npx prisma generate


7. Intégration de Prisma dans NestJS

Il est maintenant temps d’intégrer Prisma dans votre application NestJS.

7.1 Création d’un module Prisma

Commencez par créer un module dédié à Prisma :

nest g module prisma


Ensuite, créez un service Prisma :

nest g service prisma


Modifiez le service pour qu'il initialise PrismaClient :

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();
  }
}

7.2 Injection du service Prisma

Vous pouvez maintenant injecter le service Prisma dans vos autres services NestJS. Par exemple, dans un service User :

import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class UserService {
  constructor(private readonly prisma: PrismaService) {}

  async getAllUsers() {
    return this.prisma.user.findMany();
  }

  async createUser(data: { email: string; name?: string }) {
    return this.prisma.user.create({
      data,
    });
  }
}

8. Gestion des Migrations

Prisma gère les migrations de manière simple et intuitive. Après avoir modifié vos modèles dans schema.prisma, vous pouvez créer une migration :

npx prisma migrate dev --name init

Cela va générer une migration SQL et l’appliquer à votre base de données.

9. Conclusion

L'intégration de Prisma avec NestJS vous permet de tirer parti de la puissance d'un ORM moderne tout en conservant la structure modulaire et la sécurité de typage offertes par NestJS. Avec cette combinaison, vous pouvez créer des applications backend performantes, évolutives, et faciles à maintenir. Que vous travailliez sur un petit projet ou une application à grande échelle, cette stack est un excellent choix pour garantir la qualité de votre code et la rapidité de développement.

Vous êtes maintenant prêt à exploiter tout le potentiel de Prisma et NestJS dans vos projets !