Express
AJOUT : app.get(path, CHECK, (req, res, next) => {})
Express est le framework backend le plus utilisé pour NodeJS. Il facilite la construction d’applications structurées en microservices.
Installation
Exemple
app.js
Exécution
Ouvrir ensuite un navigateur à l’url http://localhost:3000
Les chemins d’accès /
et /about
fournissent une réponse http de type text/html
; le chemin /api
fournit une réponse de type application/json
(voir : Type du contenu de la réponse)
Avec l’écriture app.get('/about', ...)
, le path de l’url doit être exactement /about
Production de la réponse
Type du contenu de la réponse
L’appel response.send(val)
envoie la réponse val
dans response
et ferme la connexion :
- si
val
eststring
, leContent-Type
de la réponse est mis àtext/html
- si
val
estobject
ouarray
, leContent-Type
de la réponse est mis àapplication/json
etval
est stringifié - le
Content-Length
de la réponse est affecté - le status de la réponse est mis à 200
response
est automatiquement fermée
status()
L’appel response.status(code)
affecte le status de response
à code
et renvoie l’objet response
modifié, pour chaînage. Exemple :
sendStatus()
sendFile()
Transfère le fichier path
en assignant au header Content-Type
de la requête, le mime-type associé à l’extension du fichier transféré
Exemple
Headers
Ajouter un header :
Envoyer un cookie au navigateur
L’instruction suivante ordonne au navigateur de stocker le cookie prefs
avec la valeur video-games, books
pour le domaine qui a servi la page :
Des options peuvent être ajoutées en troisième argument :
signed: true
: le cookie n’est envoyé que sur des connexions HTTPShttpOnly: true
: le cookie n’est pas accessible par javascriptexpires
(Date) : date d’expiration du cookie. Si 0 ou non spécifié, créé un cookie de session, qui disparait à chaque fermeture du navigateur (mais pas à la fermeture d’un onglet)- ‘maxAge’ (Number) : analogue à
expires
, durée relative à la date courante en millisecondes
Lors des requêtes ultérieures, le navigateur a l’obligation d’ajouter tous les cookies VALIDES stockés pour ce domaine, à toutes les requêtes à destination de ce domaine (même depuis un autre onglet).
Pour supprimer un cookie :
En réalité, le cookie n’est pas supprimé, mais sa date d’expiration est reportée dans le passé.
Extraction des query params
Ils sont directement accessibles sous forme d’un dictionnaire dans request.query
Test :
Utilisation d’un moteur de template : ejs
Express permet de plugger des moteurs de template de façon générique et de produire des pages avec la fonction render
.
ejs est un de ces moteurs de template.
Installation
Example
Middlewares
Une application Express est essentiellement composée d’une suite ordonnée de middlewares
.
Un middleware
est une fonction de signature (request, response, next)
qui peut :
- soit directement renvoyer la réponse si les conditions présentes dans
request
sont réunies ; l’envoi de la réponse est alors réalisé par un appel àresponse.send()
ou un équivalent, et les middlewares suivants sont ignorés - soit ignorer totalement la requête par un appel à
next()
sirequest
ne réunit pas les conditions voulues par le middleware - soit enrichir l’objet
request
avec de nouveaux attributs tout en passant la requête aux middlewares suivants par un appel ànext()
. Par exemple un middleware d’authentification vérifiera querequest
contient des credentials valides pour un utilisateur, et il ajoutera un attributrequest.user
.
Les middlewares sont ‘empilés’ dans un ordre précis selon les besoins de l’application :
app.use(<middleware>)
Exemple :
app.use(<route>, <middleware>)
Route sans paramètre de position
Exemple : app.use('/api/users', middlewareFunction)
- capture
/api/users
, mais aussi/api/users/<id>
, etc. - capture tous les verbes GET, POST, etc.
Route avec paramètres de position
Exemple : app.use('/api/users/:id', middlewareFunction)
- l’argument
id
est accessible dansrequest.params.id
Middleware avec paramètres
Middlewares de parsing du body
express.json()
etc. ajoutent un attribut body
à request
contenant le contenu parsé du corps (body) de la requête, en fonction du Content-Type
spécifié dans les headers
Test :
Middleware de gestion des fichiers statiques à partir du système de fichiers du serveur
Une requête GET /aaa/bbb/ccc.x
conduit à servir le fichier statique /var/www/html/myapp/aaa/bbb/ccc.x
Une requête GET /static/aaa/bbb/ccc.x
conduit à servir le fichier statique /var/www/html/myapp/aaa/bbb/ccc.x
Sert les fichiers situés dans le sous-répertoire ‘assets’; GET /assets/logo.png
servira le fichier ./assets/logo.png
Middleware d’ajout de headers CORS
Par défaut les API XMLHttpRequest et Fetch utilisées par les navigateurs interdisent les appels vers une destination différente de l’origine (nom de domaine ET numéro de port)
Pour les rendre possible, il faut ajouter des headers spécifiques ; c’est ce que fait le middleware ‘cors’
Middleware de parsing des cookies
Le middleware cookie-parser
extrait les cookies non-expirés présents dans la requête et les met dans l’attribut req.cookies
sous forme d’un dictionnaire (cookie_name, cookie_value)
Middleware de gestion des bearer tokens
Le token est attaché à l’attribut .token
de la requête ; il est extrait des endroits suivants :
dans le header Authorization: Bearer <token>
- clé
access_token
dansreq.body
- clé
access_token
dansreq.query
- (Optional) cookie avec la clé
access_token
ATTENTION : par réussi à l’utiliser avec un cookie, même après installation et usage de cookie-parser
Helmet
Ajoute des headers qui implémentent de bonnes pratiques de sécurité