L'Architecture en Microservices : Approfondissement et Schémas
Pourquoi passer d'un monolithe à une structure en microservice ?
Requêter une base de données n'a jamais été aussi simple
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.
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;
}
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.
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.
Avant de commencer, assurez-vous d’avoir les éléments suivants installés sur votre machine :
npm install -g @nestjs/cli
)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
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.
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"
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
Il est maintenant temps d’intégrer Prisma dans votre application NestJS.
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();
}
}
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,
});
}
}
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.
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 !