Un collègue m’a parlé de différents projets personnels orientés web et de son dilemne sur le choix des techologies. Curieux j’ai voulu essayer NodeJS, Express et MongoDB. Généralement, on parle de MEAN qui est l’acronyme de plusieurs technologies : MongoDB, Express, AngularJS et NodeJs. Pour ma découverte, j’ai remplacé AngularJS par jQuery mais sous le capot c’est identique.
C’est parti pour débuter avec NodeJS, Express et MongoDB.

MongoDB

MongoDB est un moteur de base de données orientée documents et de type NoSQL, contrairement aux serveurs de base de données que j’ai l’habitude d’utiliser (SQL Server, mysql, postgresql). Je vous propose un rapide tour sachant que ce n’est pas le but de l’article.

Avant de commencer un peu de vocabulaire base de données : base de données table : collection ligne/enregistrement : document colonne : champ

MongoDB communique en JSON ce qui le rend facilement utilisable dans l’écosystème web. Les données sont stockées en JSON et les requêtes sont aussi faites avec ce langage. Il n’est donc pas nécessaire de connaitre le SQL. La même collection peut contenir des documents avec des propriétés différentes. Il n’y a pas de structure de table ce qui peut être déstabilisant.

Lancer le serveur MongoDB

REM lancer le moteur MongoDB avec la base associée à myapp
cd "C:\Program Files\MongoDB\Server\3.2\bin"
mongod.exe --dbpath c:\Users\Ghislain\Documents\nodejs\express\myapp\data

Serveur MongoDB

Comme vous serez amener à vous en servir souvent, le mieux est d’écrire un script pour faire ces actions (launchMongodb.bat).

Lancer le client MongoDB

REM lancer le client MongoDB  
cd "c:\Program Files\MongoDB\Server\3.2\bin"
mongo

REM afficher les bases
show dbs
REM utiliser une base
use <dbname>
REM inserer un document dans une collection
db.<collection>.insert()
REM lire un document dans une collection
db.<collection>.findOne()
REM mettre à jour un document dans une collection
db.<collection>.findOneAndUpdate() 
REM supprimer un document d'un collection
db.<collection>.findOneAndDelete()

Client MongoDB

Si vous souhaitez une GUI pour l’administration, vous trouverez une liste d’application à la page suivante : Documentation MongoDB - Admin UI

Documentation MongoDB - SQL to MongoDB Mapping Chart

NodeJS & Express

NodeJS open source et cross plateforme qui permet de faire des web développements coté serveur. Architecture orientée événement gérant les IO asynchrones. Express est un framework pour nodejs permettant de construire des applications web et des API. Concrètement cela permet de développer plus rapidement une API REST:

  • CREATE : POST
  • GET : READ
  • UPDATE : PUT
  • DELETE : DELETE

Création du projet NodeJS.

mkdir myapp
cd myapp
npm init
npm install express --save
npm install body-parser --save
npm install mongodb --save
mkdir data
mkdir client
REM créer un app.js
node app.js

Pour interagir entre NodeJS et MongoDB, il est possible d’utiliser le “driver” par défaut ou des surcouches comme Mongoose. Pour cet article, je vais rester avec celui de base pour éviter de complexifier le code avec les schemas Mongoose par exemple.

Creation de l’application

Pour l’exemple je vous proposer une page permettant de gérer (CRUD) des utilisateurs ayant un nom et un prénom. Cette section présente dans un premier temps le code de l’application NodeJS/Express puis les requêtes jQuery du front. Vous pourrez trouver le code complet sur le repo github en fin d’article.

NodeJS app.js

Il est bon de savoir que nodejs ne prend pas nativement en compte les modifications des sources de l’application. Soit vous relancez le serveur node à chaque fois. Soit vous installez un utilitaire qui relance automatiquement le serveur quand une modification a lieu dans le répertoire source. Exemple : Nodemon

Initialisation

CREATE

READ

Les identifiants dans MongoDB - équivalent du ID autoincrément - sont des objets à part entière. Si vous passez une chaine de caractère, la requête échoue. Vous avez probablement remarqué la ligne var ObjectID = require(‘mongodb’).ObjectID qui permet de manipuler les ObjectID. Vous pouvez donc créer l’objet attendu pour avoir une requête opérationnel : new ObjectID(req.params.userId)

UPDATE

DELETE

Front jQuery

Rendu de la page CRUD

CREATE

READ

UPDATE

DELETE

Vous pourrez trouver l’intégralité du code de cet exemple sur mon repo Github : Repo GitHub.