Publié le 26 septembre 2017

Introduction à la création d’une api REST avec Expressjs et Sequelize

Intéressant cet article ?

[Total : 1    Moyenne : 4/5]

Dernièrement, nous avons eu envie de regarder un peu du côté d’ExpressJS, et de nous essayer au développement NodeJS sur un petit projet concret. Au final, nous avons une api REST et sans reprendre dans cet article l’intégralité de l’application, on s’est dit que cela pouvait vous intéresser.

Prérequis : vous devez disposer d’un environnement NodeJS/Npm ainsi que d’une base de données MySQL.

Initialisation du projet

ExpressJS prend en charge la création d’un serveur et nous permet de mettre en place les différentes routes de notre application. Il est plus complet que cela, mais dans notre cas, c’est tout ce qui nous intéresse.

Il existe un générateur d’application, bien pratique pour initialiser un nouveau projet. Une fois cela fait, ne pas oublier de faire un npm install pour installer les dépendances.

$ npm install express-generator -g

$ express myRestApi

$ puis suivez les informations données

ArticleJB

L’application nouvellement créée est maintenant accessible à l’adresse http://localhost:3000/

Nous vous conseillons d’installer tout de suite Nodemon qui permet le rechargement automatique de l’application à chaque fois qu’un changement est détecté.

$ npm install -g nodemon

Par la suite, au lieu de lancer l’application avec npm start, on fera simplement nodemon.

Enfin, on installe Sequelize qui nous permettra de faire le lien entre nos modèles et la base de données. Il existe d’autres Object Relational Mapping (ORM), mais celui-ci est actif, correctement documenté et fonctionne avec MySQL (entre autres) ce qui était obligatoire dans notre cas. Différents connecteurs sont disponibles, choisissez celui qui vous convient.

$ npm install --save sequelize mysql

Nous avons maintenant tout ce qu’il nous faut pour entrer dans le vif du sujet. En résumé, la création d’une Application Programming Interface (API) REST consiste à définir pour chacune des entités (par exemple des poneys dans un centre équestre) gérées par l’application les routes suivantes :

  • get /poneys/ : retourne tous les poneys
  • get /poneys/:id : retourne un poney par son identifiant
  • put /poneys/ : crée un poney (et ouais)
  • update /poneys/:id : met à jour un poney par identifiant (des fois que la couleur change…)
  • delete /poneys/:id : supprime un poney (‘parait que ça se mange…)

Le format de retour sera du JSON.

Définition et synchronisation des modèles

Partons sur l’exemple suivant : des agences immobilières ont en gestion des appartements dans lequels on trouve un ou plusieurs colocataires. Les modèles seront donc les suivants :

agences <-- 1:n --> appartements <-- 1:n --> colocataires 

Définition

Dans le répertoire models (à créer au besoin, simple rangement) de notre application, nous créons trois fichiers agence.js, appartement.js et colocataire.js.

Exemple avec les agences :

'use strict';

module.exports = function(sequelize, DataTypes) {

  var Agence = sequelize.define('Agence', {

    name: DataTypes.STRING

  });

  return Agence ;

};

Le méthode define prend en paramètre le nom du modèle. Sequelize l’utilisera entre autres pour la table en bdd. Ensuite, on donne les différents attributs (ou champs) ainsi que leurs types. Ici, un simple nom.

Nous pouvons suivre ce principe avec les deux modèles suivants. Pour les appartements, faisons simple et ne mettons qu’un champ adresse. Vous pouvez bien entendu être plus exhaustif•ve et ajouter des informations comme la surface, le type de logement… De même pour les colocataires, deux champs pour le nom et le prénom suffiront.

Synchronisation

Dans app.js, nous importons nos trois modèles et créons une connexion à la bdd (attention à personnaliser la chaine de connexion et à créer la base en amont). Puis, la méthode sync() s’occupe de créer les tables correspondantes.

// connexion à la bdd
var Sequelize = require('sequelize');
var sequelize = new Sequelize('mysql://root:root@localhost:3306/myrestapi-db');

// import des modèles
const Agence = sequelize.import(__dirname + "/models/agence")
const Appartement = sequelize.import(__dirname + "/models/appartement")
const Collocataire = sequelize.import(__dirname + "/models/collocataire")

// synchronisation
sequelize.sync().then(function () {
  console.log("bdd synchronisée.");
});

Relançons l’application (automatique si vous utilisez Nodemon). Les logs au démarrage indiquent que Sequelize synchronise les modèles. Une fois terminé, le message “bdd synchronisée” s’affiche. Vous pouvez vérifier avec votre client MySQL habituel l’état de votre base. Trois tables sont maintenant créées, avec les champs que nous avons défini.

Capture_3

Relations

Dans app.js, nous importons nos trois modèles et créons une connexion à la bdd (attention à personnaliser la chaine de connexion et à créer la base en amont). Puis, la méthode sync() s’occupe de créer les tables correspondantes.

// connexion à la bdd
var Sequelize = require('sequelize');
var sequelize = new Sequelize('mysql://root:root@localhost:3306/myrestapi-db');

// import des modèles
const Agence = sequelize.import(__dirname + "/models/agence")
const Appartement = sequelize.import(__dirname + "/models/appartement")
const Collocataire = sequelize.import(__dirname + "/models/collocataire")

// synchronisation
sequelize.sync().then(function () {
  console.log("bdd synchronisée.");
});

Relançons l’application (automatique si vous utilisez Nodemon). Les logs au démarrage indiquent que Sequelize synchronise les modèles. Une fois terminé, le message “bdd synchronisée” s’affiche. Vous pouvez vérifier avec votre client MySQL habituel l’état de votre base. Trois tables sont maintenant créées, avec les champs que nous avons défini.

Nous n’avons ici fait qu’effleurer la surface des possibilités offertes par Sequelize. D’autres types de relations existent. Il est possible de mettre en place de la validation de données (obliger la présence d’une valeur sur une clé étrangère, interdire certaines valeurs…), d’ajouter des méthodes d’instances, modifier le comportement des getters et setters sur un attribut en particulier. Le système de requêtage est complet et permet le chargement des relations, la pagination… Pour tout cela et plus encore, rendez-vous sur la documentation.

Il existe une CLI qui apporte plus de souplesse en gérant les migrations et les jeux de données. Si vous vous y essayez, regardez aussi du côté du fichier models/index.js qui sera créé automatiquement. Il permet un accès plus évident aux différents modèles à travers l’application sans multiplier les imports. La CLI introduit aussi l’utilisation d’un fichier de configuration pour gérer différents contextes (base de dev, test, prod…)

Routage

Dans app.js, nous importons nos trois modèles et créons une connexion à la bdd (attention à personnaliser la chaine de connexion et à créer la base en amont). Puis, la méthode sync() s’occupe de créer les tables correspondantes.

// connexion à la bdd
var Sequelize = require('sequelize');
var sequelize = new Sequelize('mysql://root:root@localhost:3306/myrestapi-db');

// import des modèles
const Agence = sequelize.import(__dirname + "/models/agence")
const Appartement = sequelize.import(__dirname + "/models/appartement")
const Collocataire = sequelize.import(__dirname + "/models/collocataire")

// synchronisation
sequelize.sync().then(function () {
  console.log("bdd synchronisée.");
});

Relançons l’application (automatique si vous utilisez Nodemon). Les logs au démarrage indiquent que Sequelize synchronise les modèles. Une fois terminé, le message “bdd synchronisée” s’affiche. Vous pouvez vérifier avec votre client MySQL habituel l’état de votre base. Trois tables sont maintenant créées, avec les champs que nous avons défini.

Nous n’avons ici fait qu’effleurer la surface des possibilités offertes par Sequelize. D’autres types de relations existent. Il est possible de mettre en place de la validation de données (obliger la présence d’une valeur sur une clé étrangère, interdire certaines valeurs…), d’ajouter des méthodes d’instances, modifier le comportement des getters et setters sur un attribut en particulier. Le système de requêtage est complet et permet le chargement des relations, la pagination… Pour tout cela et plus encore, rendez-vous sur la documentation.

Il existe une CLI qui apporte plus de souplesse en gérant les migrations et les jeux de données. Si vous vous y essayez, regardez aussi du côté du fichier models/index.js qui sera créé automatiquement. Il permet un accès plus évident aux différents modèles à travers l’application sans multiplier les imports. La CLI introduit aussi l’utilisation d’un fichier de configuration pour gérer différents contextes (base de dev, test, prod…)

J-B

La-qualité-une-responsabilité-collective
0 Commentaires
Répondre
Se joindre à la discussion ?
Vous êtes libre de contribuer !
Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *