Développements avancés

Node.js & Vue.js

Cédric BRASSEUR

Mis à jour le 18/05/2025

Cédric BRASSEUR

  • Ancien étudiant de l'Exia.cesi
  • 4 ans consultant chez Amaris, placé chez Euro Information Dev
  • Auto-entrepreneur depuis début 2020 (Création de sites web, applications mobiles & formateur)

Et vous ?

  • Nom, prénom
  • Etudes réalisées 
  • Connaissances sur node & vue
  • Autres infos appréciées

Plan du cours

  • Node.js
    • Les cas d'utilisation de Node.js
    • Installation et mise en place du premier projet Node.js (utilisation de npm,...)
    • Les bases de Node.js
    • Mise en place d'une API avec Node.js
  • Vue.js
    • Les cas d'utilisation de Vue.js
    • Installation et mise en place du premier projet Vue.js
    • Les bases de Vue.js
    • Mise en place d'une Todo App avec vue.js
  • Interagir avec son API avec Vue.js et axios
  • Réaliser des développements plus avancés avec Firebase / Firestore
  • Sécuriser son API avec de l'authentification (si le temps le permet)
  • Exercices tout au long de la formation

Node / Vue

Objectifs de la formation

  • Renforcer son expertise dans un langage de programmation
     

  • Créer une application type client / serveur
     

  • Communiquer avec une API REST
     

  • Mettre en place un système d’authentification sécurisé

Node.js

Les bases

Node est un environnement d'exécution permettant d'interpréter le JavaScript côté serveur.

 

Node est souvent utilisé dans le domaine de l'API mais il peut être utilisé de plein d'autres façons. Des applis webs, des services de streaming,...

Node - Cas d'utilisations

Node - Installation et premier projet

Pour vérifier que l'installation s'est bien passée, dans votre terminal tapez :

node -v

Initialiser un projet node

Node - Installation et premier projet

Créer un fichier index.js (vide pour l'instant)

Puis démarrer votre serveur node avec npm

node .\index.js
npm init

Le langage Node.js est un langage à types dynamiques. Voyons quelques bases ensemble afin de bien pouvoir démarrer.

        - Les variables

        - Les fonctions / méthodes

- Les objets javascript inline

        - Exporter un module

        - Importer / utiliser un module

- Explications rapides de l'asynchronisme

Node - Les bases

Une variable n'a donc pas de type et est souvent noté via deux notations différentes : let ou const. 

  • let : Permet d'initialiser une variable avec une valeur et pouvoir la modifier par la suite
  • const : Permet d'initialiser une variable avec une valeur sans pouvoir la modifier par la suite

Node - Les bases

Les variables

Il est possible de variabiliser une fonction ! Nous verrons un exemple plus tard...

De même une fonction n'a pas de type de retour. Si un return est fait dans la fonction quelque chose sera retourné, sinon la fonction ne retourne rien.

Node - Les bases

Les fonctions

On voit deux fonctions appelés de manière différente (l'une en normal, l'autre en inline).
Possibilité de passer des paramètres et retourner des éléments si besoin.

Nous n'allons pas faire d'orienté objet de manière pure et dure dans ce cours, même si c'est possible avec Node.js. Nous n'allons utiliser que des objets dits objets inline (non déclaré, ils vont permettre de passer des arguments sous forme de fonctions)

Node - Les bases

Les objets inline JavaScript

Exemple ici, nous créons un objet avec cette structure (json)

{
	id: 1,
    name : "name",
    sub : {
    	"newProperty" : "new property"
    }
}

On peut vérifier si un objet est null ou vide avec !data directement.

On peut rajouter des propriétés directement à l'objet passé

Lorsque l'on développent en node.js, nous allons utiliser plusieurs fichiers. Pour cela, il nous faut exporter ce qui sera utilisé dans un autre fichier.

Node - Les bases

Exporter un module

En fin de fichier, on met un module.exports avec un objet contenant la liste des fonctions et / ou variables que l'on veut exporter (ici, 5 fonctions et 1 variable)

Il est nécessaire d'importer les modules afin de les référencer sur la page dans lesquels nous voulons les utiliser.

Node - Les bases

Importer un module

En fin de fichier, on met un module.exports avec un objet contenant la liste des fonctions et / ou variables que l'on veut exporter (ici, 5 fonctions et 1 variable)

Attention,
Le chemin est à adapter en fonction d'où se trouvent vos fichiers l'un par rapport à l'autre...

De nombreuses fonctions sont codés pour être asynchrones en node.js. Des adaptations sont à comprendre pour le faire fonctionner.

Node - Les bases

L'asynchronisme (base des bases...)

Déclaration d'une méthode asynchrone qui retourne une Promise (objet d'asynchronisme en node.js)

Appel correspondant

De nombreuses fonctions sont codés pour être asynchrones en node.js. Des adaptations sont à comprendre pour le faire fonctionner.

Node - Les bases

L'asynchronisme (base des bases...)

Les mots clés async / await

Comme vu précédemment, il est possible d'appeler otherAsyncFunction avec les opérateurs .then et .catch pour en interpréter le retour. Mais c'est aussi possible avec le mot clé await.

La différence réside dans la gestion d'erreur à traiter soit même dans l'appelant ici.

La méthode .map() sert à transformer chaque élément d’un tableau pour créer un nouveau tableau.

Node - Les bases

Opération map

Elle peut également être utilisée pour itérer sur un ensemble d'éléments

La spread syntax (...) permet de copier ou étendre un tableau ou un objet.

Node - Les bases

Spread syntax

Ceci peut être également réalisé sur un objet pour en modifier une seule propriété (pratique pour dupliquer un objet sans en changer l'id par exemple)

Démonstration, les bases de node...

Node - Demo

Documentation Node

(Je n'aime pas cette doc... Mais bon)

Node - Demo

Le but de cet exercice est de pratiquer un peu les bases de Node.js vu ensemble

  • Installez node
  • Initialiser un projet node
  • Créer un index.js contenant votre code node
  • Créer des variables, fonctions, exports, import... (Le sujet importe peu)
  • Créer des objets inline à passer en paramètre d'une fonction par exemple
  • Réalisez des imports et des exports de méthodes entre deux fichiers.
  • Testez un peu l'asynchronisme et posez des questions !

Node - Exercice

Premier exercice...

Envoyer workshop_node.md

Nous allons faire le corrigé de l'exercice ensemble afin d'avoir une base commune entre chaque exercice (N'hésitez pas à partir sur votre code et l'adapter si nécessaire !)

Node - Demo

Node.js

Les tests unitaires

Node - Les tests unitaires

Un test unitaire est utilisé afin de pouvoir vérifier atomiquement que chaque élément de notre code. On va donc vérifier que le code produit bien le résultat attendu.

A savoir :

  • Systématique pour chaque projet !
  • Réfléchir efficacement à ce qui doit être testé, inutile de tester si 1 + 1 = 2.
  • Test Driven Development (TDD): Méthodologie récente visant à démarrer ses développements par des tests unitaires

Jest est un des framework les plus utilisés en javascript (ou ses concurrents Mocha, ou Vitest)

 

Rien de bien complexe:

  • On installe le package jest npm install jest --save-dev
  • On créer un dossier __tests__
  • On y créer un fichier index.spec.js
  • Et on y développe les différents tests unitaires !

Jest

On utilise describe pour englober un ensemble de tests cohérents ensemble :

Jest

describe('SampleCode', () => {
  // ... Nos différents tests ici
})

On peut utiliser le mot clé it pour créer un test et avec le mot clé expect, on peut faire une vérification :

it('returnNumberPlusThree should return number plus three', () => {
  	expect(returnNumberPlusThree(5)).toBe(8)
})

Le mot clé test existe aussi, mais il est plus utilisé pour vérifier un ensemble, une fonctionnalité (mais ça fait la même chose) :

test('returnNumberPlusThree should return number plus three', () => {
  	expect(returnNumberPlusThree(5)).toBe(8)
})

On peut également avoir des paramètres à nos tests, dans cet exemple, nos tests vont se lancer 3 fois avec les 3 paramètres différents :

Jest

it.each([
  [0, 3], // Minimal value
  [20, 23], // Random value between
  [100, 103], // Maximal value
])('should return number plus three', (input, expected) => {
  expect(returnNumberPlusThree(input)).toBe(expected)
})

L'objectif est très souvent de tester les bornes minimales et maximales ainsi qu'une valeur au milieu. Dans l'exemple précédent, 0 est le minimum, 100 le maximum.

Mise en place d'un contexte commun à nos différents tests, celui-ci sera donc réinitialisé comme voulu avant chacun des tests du describe :

Jest

const {
	add, 
	substract,
	multiply,
	divide
} = require('../calculator')

describe('Calculator test suite with context for each tests', () => {
	let context

	beforeEach(() => {
		// It doesn't malke so much sense here, but
		// We could use beforeEach to add a similar context for a game
		// Starting with 2 players at the position 1 of a board
		context = {
			numberOne: 10,
			numberTwo: 5
		}
		console.log('Before each test')
	})

	it('add method with two numbers should return addition', () => {
		expect(add(context.numberOne, context.numberTwo)).toBe(15)
	})

	it('substract method with two numbers should return substraction', () => {
		expect(substract(context.numberOne, context.numberTwo)).toBe(5)
	})

	it('multiply method with two numbers should return multiplication', () => {
		expect(multiply(context.numberOne, context.numberTwo)).toBe(50)
	})

	it('divide method with two numbers should return division', () => {
		expect(divide(context.numberOne, context.numberTwo)).toBe(2)
	})
})

Pour démarrer ses tests, vous pouvez définir un script qui va lancer vos tests dans votre package.json

 

Jest

Afin d'exécuter ce script, il suffit de lancer cette commande dans votre cmd :

npm test

Petit workshop pour pratiquer les tests unitaires avec Jest

Jest - Workshop

Envoyer Workshop_jest.md

Node.js & les APIs

avec Express

Une API est un ensemble de points d'entrés que l'on va pouvoir appeler en requêtes HTTP(s) afin de pouvoir communiquer avec un serveur de manière précise et, si c'est bien fait, sécurisé.

Express, une API ? 

Voici une simple API publique :

https://api.chucknorris.io/jokes/random

Ceci est donc un point d'entrée pour récupérer une blague random au format JSON (nous y reviendrons)

Définition et exemples

Les échanges se font via des requêtes HTTP. Ces requêtes sont envoyés avec une request (pour identifier la requête et l'utilisateur) encore une fois au format JSON.
La requête HTTP fait le retour d'information via une response, celle-ci aussi au format JSON.

Express, une API ? 

La requête HTTP

Et voici un exemple de response...

Express, une API ? 

La requête HTTP

Les interfaces - REST

Representational State Transfer

De manière générale, le Web est composé de REST (états et fonctionnalités basées sur des appels d'URL).
En l'occurrence pour notre exemple notre API tournera sur le port 3000 en local (http://localhost:3000/)

GET

HEAD

PUT

DELETE

POST

OPTIONS

Récupération d'un contenu

Comme GET mais pour le header (méta)

Mise à jour de contenu

Ajout de contenu

Suppression de contenu

Retourne les ressources disponibles

Les interfaces - REST

Utilisation de Postman

Postman est un outil de requêtage REST très pratique. 

Conseillé sous Windows

Il permet de faire tout type de requêtes et même de paramétrer les headers ainsi que les autorisations ou le payload qui sera envoyé à la requête. Il va nous servir afin de tester nos développements sans avoir à créer de code pour simuler le client.

Les interfaces - REST

Utilisation de Postman

Demo Postman

La structure JSON

{
	"premiereCollectionTableauObject": [
    	{
          "premierObjet" : {
              "nom": "BRASSEUR",
              "prenom": "Cédric",
          },
        },
        {
          "secondObjet" : {
              "nom": "JEAN", 
              "prenom": "Sébastien",
          },
        },
    ],
    "secondNoeudSimpleValeur" : 10,
},

Le JSON permet de stocker des données comme on le souhaite, sous forme de tableaux, d'objets ou de simple association
clé => valeur

Avantages

  • Lecture rapide et efficace sans accès réseau (potentiellement)
  • Format lisible par n'importe quel être humain et n'importe quelle machine (OS)
  • Utilisable nativement avec un grand nombre de technologies
  • Stockage de différents types de données
  • Syntaxe simple et efficace
  • Habituel pour les développeurs (normalement)

Inconvénients

JSON (très utilisé en JavaScript)

  • Il faut sécuriser soit même les données sensibles
  • Pas d'identification précise des données (sous forme de balise par exemple), la structure doit donc être connue avant utilisation.
  • Une erreur de code peut vite détruire l'intégrité de vos données

JSON et Node

Il est possible de travailler directement avec du json lorsque l'on travaille avec node. La syntaxe ressemble grandement à la notation objet inline et c'est celle ci que nous utiliserons dans la plupart des cas.

 

Par exemple, importer un fichier .json nous permet d'avoir le contenu json directement sous forme d'objet en node. 

Fichier animals.json à la racine

JSON et Node

Dans l'autre sens...

Permet d'écrire les objets du tableau dans un fichier json

Express est un framework permettant de nous simplifier grandement la création de route (minimal API).

 

Nous allons créer des endpoints qui seront les points d'accès au backend de notre application.

Express, une API ? 

Express, c'est quoi ?

Pour info, même si Express n'est plus maintenu, il reste encore très utilisé dans le monde de l'API node (A vérifier, mais il semblerait que Express soit toujours maintenu)

 

Un projet de continuité d'express existe : Fastify. Fastify, c'est express à la base et ça continue d'être maintenu.

Vous avez sûrement compris, nous allons utiliser npm pour installer node. (Commande à exécuter à la racine du projet, là où se trouve votre package.json)

Express, une API ? 

Installer le package node

npm install express

Vous avez sûrement compris, nous allons utiliser npm pour installer node. (Commande à exécuter à la racine du projet, là où se trouve votre package.json)

Initialiser express

L'API doit continuer de tourner pour qu'elle puisse être appelée. Bien qu'il suffise d'un appel à la commande ```node index.js```, il est nécessaire d'indiquer à notre programme ce qu'il doit écouter et sur quel port le faire.

Express, une API ? 

Ecouter / Attente des appels des endpoints

Ceci va indiquer à node de continuer d'écouter les appels effectués en local sur le port défini précédemment (3000 pour notre cas)

Maintenant, il ne reste plus qu'à définir les endpoints...

Express, une API ? 

Premières routes

Ici, on défini une nouvelle
route '/' (racine) en GET.

res.status(404).send
permet de renvoyer une response d'erreur

res.send(animals)
renvoie la liste des animaux
en JSON et statut 200

Notez deux choses : Le paramètre get est directement dans req.params.id (et non req.body) & nous vérifions toujours si il y a un animal à renvoyer sinon nous envoyons un message d'erreur.

Express, une API ? 

Premières routes avec paramètre get

Pour gérer les problèmes de cors, nous avons deux moyens pour le développement. Le premier étant d'utiliser un package nommé cors, installable vie npm.

Express, une API ? 

Un problème de cors ?

Ensuite, il suffit d'appeler la méthode pour l'initialiser dans l'app. 

Le second moyen est d'ajouter une extension dans le navigateur, personnellement j'utilise celle-ci

Avec une requête HTTP, on l'a vu, on peut envoyer des données associées à la requête. Il est possible d'accéder à ces données (payload) en utilisant un autre package nommé body-parser

Express, une API ? 

Gérer le body d'une requête

Ce package va permettre d'accéder directement au payload dans le paramètre request associé à la route.

Donc dans req.body sur l'exemple ci-dessous :

Un exemple de requête POST avec des paramètres dans le body de la requête.

Express, une API ? 

Les autres types de requêtes...

Un exemple de requête DELETE avec un paramètre id dans la requête

Express, une API ? 

Les autres types de requêtes...

Démo express + Postman

Express - Demo

Documentation Express

Envoyer exercice workshop_express.md

Node - Exercice

L'architecture Client / Serveur

Architecture Client / Serveur

L'architecture Client / Serveur est plutôt simple, il y a plusieurs clients (dans notre cas, des navigateurs d'utilisateurs) et un serveur.
Le navigateur fait tourner le front (visuel) de l'application.
Le serveur contient la logique métier de l'application.
La communication se fait entre les deux via des requêtes http.

Serveur

Client

Client

Client

Client

Requêtes HTTP(s)

Données json

Architecture Client / Serveur

Voici le schéma de ce que nous allons mettre en place au fur et à mesure de l'avancement de la formation et de l'exercice sur la todo app.

 

Pour l'instant, nous n'avons que mis en place l'API avec express

Nous rajouterons l'authentification et l'utilisation de Directus

Vue.js

Vue.js est un framework de JavaScript permettant de construire des interfaces (front)

Quelques exemples de projets utilisant vue :

  • Gitlab
  • Sandbox
  • Nintendo...

Vue.js - Cas d'utilisation

Code sandbox

Vue est utilisé pour de nombreux frameworks, comme Quasar qui est de plus en plus utilisé aujourd'hui.

Vue.js - Cas d'utilisation

Vuetify

Des infos sur ces frameworks

Vue.js - Cas d'utilisation

  • Nuxt est un framework basé sur Vue.js qui facilite la création d'applications web, avec rendu côté serveur, routing, génération statique et SEO optimisé...

  • Vite est un bundler moderne ultra-rapide qui offre un serveur de développement avec hot reload et un build performant.

  • Next est un framework React pour développer des applications web avec rendu côté serveur, génération statique et API intégrées.

  • Quasar est un framework Vue.js qui permet de créer des applications web, mobiles et desktop à partir d’un seul codebase avec bcp de composants

  • Vuetify est une bibliothèque de composants UI pour Vue.js qui permet de concevoir rapidement des interfaces propres.

Vue.js - Installation et premier projet

Ici également nous allons utiliser npm pour créer le projet vue

Créer le projet vue

npm create vue@latest

Initialiser les dépendances

npm update
npm install

Démarrer son projet

npm run dev

Regardons un peu le contenu déjà proposé...

Le template est l'élément parent de tout page vue, l'objectif étant l'encapsulation et la possibilité d'utiliser des particularités de vue dans les balises (que nous verrons plus tard dans ce chapitre)

Vue - Les bases

Le template

Comme une page HTML classique, nous pouvons utiliser des balises HTML afin de définir les éléments qui vont composer notre page. h1, h2, header, footer, div, p,...

Vue - Les bases

Le HTML

Il existe plusieurs manières d'ajouter du css à notre page en général on utilise un fichier main.css pour le css global de notre page (et éventuellement un base.css pour les éléments de base). Et il suffit de l'importer dans le fichier vue (ici, mon main.css est dans src/assets)

Vue - Les bases

Le CSS

Il est aussi possible d'appliquer le css à un composant (ou une page) directement sans impacter l'intégralité de l'application.

Afin de pouvoir travailler en direct avec les éléments vue, il est possible de mettre en place un store qui sera un élément essentiel de notre utilisation de vue.

Vue - Les bases

Le "store"

Vue fonctionne avec un workflow dont il faut connaître certains aspects...

Vue - Les bases

Le workflow

Cliquer ici pour plus de détails

Vue - Les bases

Les data

Les data sont les données qui seront intégrées par vue afin de pouvoir les rendre dynamique sur la page.

Ces données sont accessibles de plusieurs manières dans notre balise template contenant nos tags HTML, exemple le plus simple :

Vue - Les bases

Les méthodes

Les méthodes sont définies dans le script de la page vue et peuvent être utilisées directement associée à des boutons par exemple...

Ici, nous avons deux méthodes accessibles, par exemple depuis l'action d'un bouton

A noter que les données (de data) qui sont reverse sont automatiquement modifiées sur la page sans avoir à recharger la page

Vue - Les bases

Les computed

Les computed sont des éléments calculés sur la page (toujours liés au data) qui sont rafraîchies en fonction de l'évolution du state de la page (des données dans data)

Vue - Les bases

Mounted

Comme on l'a vu sur le workflow de vue, les données sont rechargés à chaque fois en suivant un workflow, par exemple mounted permet de réaliser des opérations à chaque fois que la page est montée (Génération du DOM de la page)

Vue - Les bases

Updated

Comme on l'a vu sur le workflow de vue, les données sont rechargés à chaque fois en suivant un workflow, par exemple updated permet de réaliser des opérations à chaque fois qu'une donnée est modifiée sur la page

Vue - Les bases

Les v-if

Il est possible de conditionner l'affichage d'un tag html avec v-if, prenons un exemple :

La span s'affichera uniquement si la tâche a la propriété isDone à terminée.

N'oubliez pas le todo pour accéder aux propriétés de chaque élément mis dans la liste à puce

Vue - Les bases

Les v-if / v-else-if / v-else

Voici un exemple plus complet avec les trois possibilités de conditions que l'on peut enchaîner dans notre page vue.

N'oubliez pas le todo pour accéder aux propriétés de chaque élément mis dans la liste à puce

Vue - Les bases

Les v-for

Il est possible de boucler l'affichage d'un tag html avec v-for, prenons un exemple :

Ceci permettra d'afficher autant de liste à puce que notre "todoList" contient d'éléments.

Vue - Les bases

Les :class

Nous pouvons conditionner les class CSS données à un tag également...

La class CSS done est ajoutée à toutes les todo qui ont un isDone à true.

 

Ces class sont souvent (mais pas obligatoirement) définies dans la balise style scoped du fichier vue.

Vue - Les bases

Les formulaires

Voyons un exemple de formulaire ou l'on empêche le rechargement de la page directement via @submit.prevent dans le tag du formulaire. (On remplace le rechargement de la page en passant tout de même les données des inputs et on peut appeler une méthode par exemple...)

Ici, on associe le click sur le button submit à la méthode addTodo.
Et on associe un v-model sur l'input afin de pouvoir récupérer la valeur de l'input dans notre méthode addTodo

Vue - Les bases

Un exemple plus complet de store

Vue - Les bases

Un exemple plus complet de store

Il est aussi possible ici d'appeler des méthodes du workflow vu précédemment, comme "mounted" par exemple...

Démonstration Vue.js

Vue.js - Demo

Vue.js - Documentation

Vue.js - Exercice

Envoyer le fichier workshop_vue.md

Interactions Node.js & Vue.js

avec axios

Axios - L'import

Axios est une librairie JavaScript qui permet de réaliser des requêtes HTTP de manière assez fluide depuis notre application.

Il faut d'abord installer axios avec npm

npm install axios

Ensuite, il faut importer axios

Axios - Les http requests

Axios propose des méthodes get, delete, post, patch,... Pour créer des appels HTTP (client http) afin de pouvoir récupérer les résultats d'une API.
Voici un exemple avec du get, du delete et du post... 

Attention, les méthodes sont asynchrones !

Axios - L'adaptation du code vue

Import et utilisation dans Vue.js

Démonstration Axios

Axios - Demo

Axios - Documentation

Exercice - Axios

Envoyer le workshop_axios.md

Les composants

(Vue.js)

Un des avantage de vue est de pouvoir séparer le code en composants custom réutilisables.

Vue.js - Les composants

Un composant offrant la possibilité d'être appelé plusieurs fois avec par exemple une valeur différente.

Prenons un exemple en créant une carte pour chaque animal présent dans la liste d'animaux.

Il est utilisé depuis le template parent de cette façon

Vue.js - Les composants

On l'importe dans le parent pour le rendre accessible dans son template. L'import en début de script et dans le template du parent on appelle le composant

Il est possible de partager des valeurs de manière descendante à nos composants, ce sont les props.

Vue.js - Les composants

Les props

Ici, elles sont définies à droite :animal="animal" signifie que je vais envoyer un objet animal à AnimalCard et ce sera fait autant de fois qu'il n'a été remonté d'animaux dans le parent.

Le code du composant

Parfois nous voulons binder des éléments d'enfant vers leurs parents

Vue.js - Les composants

Les v-model

La data message du parent est maintenant liée aux modifications réalisées dans le composant

Le code du composant

Il est aussi possible de déclencher des events depuis le code de l'enfant pour que ces events soient écoutés par le parent

Vue.js - Les composants

Les events

Le code du parent

Le parent reçoit l'évenement et défini ce qu'il veut faire comme opération dans ce cas (ici, il met à jour la liste d'animaux)

Démo - Les composants vue

Démonstration

Exercice - Les composants vue

Envoyer le workshop_components.md

Exercice - Les composants vue

Corrigé du workshop

Nuxt

Framework Vue.js

Je conseille vivement d'utiliser Nuxt pour ses nombreux avantages https://nuxt.com/

Nuxt

Nous ne verrons pas comment utiliser Nuxt durant cette formation, mais la documentation est excellente !

  • Rendu côté serveur (SSR) facile à mettre en place pour de meilleures performances et un bon SEO.

  • Génération de site statique possible (SSG), idéale pour le déploiement sur des hébergements statiques.

  • Routing automatique basé sur la structure des fichiers dans pages/.

  • Gestion centralisée des métadonnées SEO via head() ou useHead().

  • Prise en charge de Vue 3 et de Composition API (depuis Nuxt 3).

  • Support TypeScript intégré et bien documenté.

  • Plugins et middleware faciles à configurer pour ajouter des fonctionnalités globales.

  • Modules Nuxt (auth, i18n, PWA, etc.) qui accélèrent le développement.

  • Expérience DX (Developer Experience) fluide avec hot reload.

  • Écosystème actif et communauté dynamique avec une documentation riche.

Directus

Directus - Présentation et documentation

Directus est un headless CMS qui offre de nombreuses fonctionnalités intéressantes pour les développeurs, par exemple :

  • Interface administrateur complète
  • Gestion de la géolocalisation
  • Gestion des collections et des données
  • Gestion des utilisateurs et authentifications
  • Sécurisation de vos routes
  • API intégrées
  • ...

Directus - Initialisation du projet

Pour utiliser Directus, nous avons besoin de quelques prérequis. Pour commencer, Directus nécessite d'utiliser une version de Node 22+

 

Pour ceci, nous allons utiliser NVM : Cliquer sur ce lien pour en savoir plus. (N'oubliez pas de redémarrer VSCode après installation de nvm)

Vous pouvez utiliser les commandes suivantes pour installer la version 22.11.0 de node

Prérequis

nvm install 22.11.0
nvm list
nvm use 22.11.0

Directus - Initialisation du projet

Directus s'installe dans un nouveau dossier vide et la commande a exécuter est la suivante

Initialisation

npm init directus-project@latest {project-name}

Nous aurons quelques choix à faire et pour la base de donnée, je vous conseil d'utiliser MySQL qui nécessite le moins de configuration et propose toutes les fonctionnalités de directus (même la géolocalisation). Bien entendu, ceci nécessite d'avoir MySQL en local (via wamp par exemple)

Vous aller devoir créer un compte admin pour directus, mettez ce que vous voulez mais retenez le bien (moi, j'ai mis admin@example.com / Admin123-) 

Créez votre base de données sur MySQL vous même, directus ne le fait pas par défaut (en cas d'erreur, voir slide suivante)

Directus - Initialisation du projet

Erreur possible avec MySQL

Dans ce cas, c'est que l'encodage pour votre base ne correspond pas et qu'il y a un problème de nombre d'octets pour une clé spécifique de directus.

 

Dans ce cas, créez votre base via une commande SQL.

CREATE DATABASE db_name CHARACTER SET utf8 COLLATE utf8_general_ci;

Directus - L'accès admin

L'un des gros avantages de Directus est le panel admin pour administrer votre projet et votre base de données.
Pour démarrer Directus en local, utiliser la commande suivante :

Accès au panel admin

Si l'instance directus est lancée, vous devriez y avoir accès ici : http://localhost:8055/admin/login

L'un des gros avantages de Directus est le panel admin pour administrer votre projet et votre base de données.

npx directus start

Directus - L'accès admin

Nous allons prendre un peu de temps pour faire le tour du panel admin afin de :

  • Créer des collections
  • Créer un rôle User
  • Gérer les accès du rôle user
  • Créer un utilisateur
  • Gérer les permissions de manière filtrée
  • Et nous accèderons en direct à la base de données MySQL via l'extension VSCode "MySql" par Weijan Chen

Le panel admin, petit tour d'horizon

Directus - L'API Directus

Comme expliqué plus tôt, Directus propose une API intégrée qui respecte les droits que nous avons mis en place sur notre rôle, pour l'instant, nos requêtes http seront faites sur le rôle public (N'oubliez pas de gérer les rôles)

Documentation

N'hésitez pas à regarder la doc Directus elle est très bien faite.

Voici le lien

Directus - L'API Directus

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

GET

Pour récupérer des données de la collection animal, vous pouvez appeler le endpoint suivant : http://localhost:8055/items/animal

Notez le /items/ permettant d'accéder à vos collections.

Filtered GET

Nous pouvons également filtrer les données par exemple : http://localhost:8055/items/animal?filter[species][_eq]=Dog

Récupère tous les chiens dont species est égal à Dog.

Directus - L'API Directus

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

POST

Pour ajouter des données, c'est le même endpoint http://localhost:8055/items/animal

Il suffit de données un body contenant les données que l'on veut insérer dans la collection.

 

Si vous ne mettez pas les données marquée en "required" en base de données, vous recevrez une erreur "FAILED_VALIDATION".

Directus - L'API Directus

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

DELETE

Pour supprimer des données, c'est le même endpoint en rajoutant l'id http://localhost:8055/items/animal/{id}

 

Il est aussi possible de donnée un body afin de filtrer les données que l'on souhaite supprimer, par exemple ce body permet de supprimer toutes les espèces égale à Dog

{
    "query": {
        "filter": {
            "species": {
                "_eq": "Dog"
            }
        }
    }
} 

Directus - L'API Directus

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

PATCH

Pour modifier des données, c'est le même endpoint en rajoutant l'id http://localhost:8055/items/animal/{id}

 

Pensez bien à mettre un endpoint en type PATCH avec un body contenant vos modifications.

{
    "species": "Cat",
    "sound": "Meow",
    "description": "Want to take over the entire world !",
    "status": "published"
}

Directus - Création de compte

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

Create user

Pour ajouter un utilisateur, vous devez ajouter le droit au rôle public en création sur la collection system directus_users

Cliquer sur "System Collections" et autoriser l'ajout d'utilisateur comme ceci

Directus - Création de compte

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

Create user

Un utilisateur a minimum besoin d'un email et d'un mot de passe (le mdp sera hashé directement par Directus).
Pour créer un utilisateur, vous pouvez appeler le endpoint en POST : http://localhost:8055/users

Avec un role (si vous en avez créer un)

{
  "email": "cdric.brasseur@gmail.com",
  "password": "Azerty123-",
  "role": "fc3bae1e-3506-4c47-812c-ad46c22cee2e"
} 

Voici un exemple de body

Directus - Authentification

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

Authenticate user

Vous pouvez authentifier un utilisateur avec le endpoint en POST également : http://localhost:8055/auth/login

Il faut un email et un password dans le body

{
    "email": "cdric.brasseur@gmail.com",
    "password": "Azerty123-"
}

Voici un exemple de body

La réponse contiendra 3 éléments

Directus - Le token

Il est possible d'effectuer énormément d'opérations directement avec cette api, voyons en quelques unes...

Utiliser le token

Pour réaliser une requête HTTP en étant authentifié, il suffit de rajouter un header Authorization en bearer token avec le token récupéré précédemment.

Ceci permettant d'identifier l'utilisateur réalisant la requête (afin de pouvoir gérer les droits et rôles de l'utilisateur)

Directus - Endpoint custom

Nous pouvons aussi créer nos endpoint custom (ce qui est très fréquent dans un monde réel afin de vérifier les entrées utilisateur)

Pourquoi créer un endpoint custom ? 

La mise en place d'un endpoint custom est souvent nécessaire pour des endpoints particuliers comme :

  • Développer un endpoint qui utilise un service tier (service de paiement pas exemple)
  • Développer un endpoint nécessitant des validations particulières
  • Développer un endpoint avec des objectifs multiples et couplés (par exemple une modification de plusieurs collection en un seul endpoint)
  • Développer tout ce qui n'est pas possible via l'API basique

Directus - Endpoint custom

Créer un endpoint custom

Pour créer un endpoint custom, utilisez le créateur d'extension de directus. Placez vous dans le dossier extensions de votre projet Directus.

npx create-directus-extension@latest

Choisissez endpoint et suiviez les instructions. Ceci va vous créer un dossier au nom du endpoint choisi et un sous dossier "src". Dans ce sous dossier, vous avez un fichier index.js

export default (router) => {
  router.get('/', (req, res) => res.send('Hello, World!'))
}

Buildez votre extension (cd extensions, puis npm run dev). Puis redémarrez votre directus avec npx directus start.
Enfin vous aurez accès à votre custom endpoint via

http://localhost:8055/custom-endpoint-name

Directus - Endpoint custom

Créer un endpoint custom

De la même façon, il est possible de créer des endpoints avec des sous routes. 

export default { 
	id: 'hello', handler: (router) => { 
		router.get('/', (req, res) => res.send('Hello, World!')) 
		router.get('/intro', (req, res) => res.send('Nice to meet you.')) 
		router.get('/goodbye', (req, res) => res.send('Goodbye!')) 
	}, 
}

En réalisant les mêmes étapes de build et de redémarrage de Directus que la slide précédente, vous aurez accès aux endpoints aux URL suivantes :

Directus - Endpoint custom

La documentation peut vous apporter des informations complémentaires sur ce qu'il est possible de faire dans un endpoint custom, n'hésitez pas à la parcourir !

Directus - Les autres extensions

Il existe de nombreux autres types d'extensions qui peuvent être utiles avec Directus...

Par exemple 

Directus - Le sdk

Pour réaliser ces opérations sans passer par axios, il est possible d'utiliser le sdk de Directus

Voir documentation (exemple authentification)

Nous ne couvrirons pas le développement depuis le SDK Directus, mais c'est une façon de faire efficace également. Ce qu'il faut savoir, c'est que vous allez utiliser directement les outils de Directus pour réaliser les appels à votre API, ce qui peut être plus cohérent dans vos développement mais n'apporte apparemment aucune optimisation particulière.

 

Tout est faisable via le SDK ou via axios.

Directus - Démo

Démonstration

Directus - Exercice

Envoyer le fichier workshop_directus.md

Firebase

Qu'est-ce que Firebase / Firestore

Documentation : https://firebase.google.com/docs/firestore?hl=fr

Firebase - Présentation et documentation

  • Créer une base firestore
  • Créer un api web pour ce projet dans firebase
  • Créer une première collection avec un document de base correspondant
  • Récupérer les paramétrages de cet api web
  • Initialiser la connexion à Firestore
  • Import de Firebase
  • InitFireStore()
  • Documentation et montrer des exemples de requêtage de la BDD firestore CRUD classique

Doc firestore

Firebase - Présentation et documentation

Nous allons rapidement voir Firebase / Firestore et si nous sommes en avance, nous pratiquerons un peu. Mais nous nous concentrerons surtout sur Directus pour les fonctionnalités de dév avancées

CRUD avec firestore et une API

Synchronisation des informations entre la BDD et votre / vos fronts

Firebase - Démonstration

Mise en place de Firestore pour la Todo App

 

 

(Nous ne ferons surement pas cet exercice, nous nous concentrerons sur Directus, la partie suivante de la formation)

Firebase - Exercice

Evaluations

Partie pratique

BON COURAGE !

(après c'est fini)

Pas d'évaluation sur ce module !

 

Mais, je vais regarder vos travaux sur ces deux jours afin de pouvoir donner un avis sur vos compétences à votre responsable de promotion

Développement avancés Node.js & Vue.js

By Cėdric Brasseur

Développement avancés Node.js & Vue.js

Formation Fullstack sur la programmation "avancée" avec les langages node.js & vue.js

  • 319