Créer un CRUD avec NestJs

NestJs est un framework NodeJs basé sur ExpressJs. Celui-ci permet la mise en place d’API Rest avec Typescript.

La force de NestJs est de permettre la mise en place d’un code structuré où de nombreuses problématiques techniques ont déjà été anticipées par le framework.

Nous allons ici voir comment mettre en place un CRUD basique (Create Read Update Delete) sur une entité donnée.

Vous pouvez retrouver les sources du projet sur notre Github : https://github.com/ND-open/nestjs-example

Initialisation de la coquille

Tout d’abord, récupérez le template de démarrage proposé par NestJs :

Créer une CRUD avec NestJs

Installez les dépendances :

Créer une CRUD avec NestJs

Vous êtes prêt à lancer le projet en mode dev :

Créer une CRUD avec NestJs

Finalement, nettoyez quelques éléments :

  • Supprimez le fichier “src/app.controller.ts”
  • Supprimez le fichier “src/app.service.ts”
  • Modifiez le fichier “src/app.module.ts”

Créer une CRUD avec NestJs

Le projet est prêt à accueillir le CRUD.

Création du module

En NestJs, pour découper des ensembles de logiques les uns des autres, on les regroupe par module. Un module est une class avec l’annotation “@Module”. Par convention, on crée également un nouveau dossier pour chaque module.

Créez un nouveau module en créant le dossier “src/users”, puis le fichier “src/users/users.module.ts” :

Créer une CRUD avec NestJs

Repository

Les repositories entrent dans la catégorie des providers. Il s’agit de class en NestJs annotées “@Injectable”, qui permettent des fonctionnalités transverses au module. Il peut s'agir d’une repository, d'un service, etc. L'intérêt de ces éléments est la possibilité de les injecter dans d'autres classes par injection de dépendances.

Dans un premier temps, et pour ne pas avoir à utiliser de base données (MSSQL, MySQL, etc), nous allons créer un repository qui viendra simuler le comportement d’une BDD.

Créer le fichier “src/users/users.repository.ts” :

Créer une CRUD avec NestJs

Ce fichier contient l’ensemble de logique permettant de gérer une liste d’utilisateurs simplement stockée dans une variable : lister, lire, créer, modifier et supprimer.

Service

De la même manière que le repository, le service d’un module (du moins le principal) est le point de passage entre le controller (cf chapitre suivant) et les autres services en charge de manipuler les données. C’est ici que vous allez pouvoir retourner des erreurs à votre API par exemple.

Créez le fichier “src/users/users.service.ts” :

Créer une CRUD avec NestJs

Vous pouvez remarquer que le UsersRepository est injecté dans le constructeur dans la class, c’est ce que l’on appelle l’injection de dépendances. Pour que celle-ci fonctionne, ajoutez UsersRepository dans la liste dépendance providers du “users.module.ts”, puis profitez-en pour y ajouter également le “UsersService”.

Controller

Un controller est une class en NestJs responsable de la réception des requêtes et de l'envoi d’une réponse au client. L’annotation “@Controller” est utilisée pour qualifier la class.

Créez le fichier “src/users/users.controller.ts” :

Créer une CRUD avec NestJs

Vous avez certainement dû remarquer qu’il vous manque un fichier, créez alors “src/users/users.dto.ts” :

Créer une CRUD avec NestJs

Ce fichier DTO (Data Transfer Object) est une simple class utilisée pour sérialiser les données reçues par le controller, c'est-à-dire : transformer un JSON en objet Typescript manipulable.

N’oubliez pas d’ajouter UsersController dans la liste dépendance controllers du “users.module.ts”.

Et voilà ! Vous pouvez maintenant tester les différentes routes via Postman ou Insomnia par exemple. Le routes disponibles sont les suivantes :

  • GET http://localhost:3000/users
  • GET http://localhost:3000/users/1
  • POST http://localhost:3000/users { "fullname": "test123qsd", "email": "Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser." }
  • PUT http://localhost:3000/users/1 { "fullname": "test123qsd", "email": "Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser." }
  • DELETE http://localhost:3000/users/1

Bien sûr, les possibilités de NestJs ne s’arrêtent pas ici, vous pouvez aller beaucoup plus loin en intégrant une validation des données des DTO (via Class-Validator), un Swagger, un système d'authentification (JWT et Refresh Token), un Logger (Nest-Winston) ou encore, bien évidemment, une base de données et un ORM (Prisma, TypeOrm, etc).

NestJs est un framework NodeJs complet et professionnel qui permet de mettre en place des API simplement et de manière structurée. Cette API peut servir pour d'autres services afin de pouvoir consommer des données ou bien relier à un front en React.

Vous avez besoin d’API pour exposer vos données ? D’une application web pour les gérer ? Next Decision se fera un plaisir de vous accompagner sur votre projet. Contactez-nous !