Table des matières

Serveur Web minimal en Node.js

Sauvegardez le code suivant dans un fichier web.js

import { createServer } from 'http';

const host = 'localhost';
const port = 8080;

const server = createServer();

server.on('request', function(req, res) {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Salut tout le monde !\n');
});

server.listen(port, host, () => {
    console.log(`Server is running on http://${host}:${port}`)
});

Installez le module http s’il n’est pas déjà présent en exécutant la commande suivante :

npm install http 

Exécuter le code précédent dans node et tester le en utilisant un navigateur Web et en vous connectant sur http://localhost:8080.

$ node web.js
Server is running on http://localhost:8080

Premier pas avec Express

Expérimentez l’application minimale ci-dessous.

import express from 'express';

const host = 'localhost';
const port = 8080;

const app = express();

app.get('/', function(req, res) {
    res.send('Hello !');
});

app.get('/home', function(req, res) {
  res.send('Maison :-)');
});

app.get('/user/:uid', function(req, res) {
  res.send('Bonjour ' + req.params.uid);
});

app.use(function(req, res){
  res.status(404).send('Page introuvable !');
});

app.listen(port, host, () => {
    console.log(`Server is running on http://${host}:${port}`)
});

Utilisez les modules ejs et markdown pour générer des réponses html facilement. Le module ejs est un module pour les templates HTML. Il faut mettre les fichiers de templates dans un répertoire views.

Express et les middleware

Installer et configurer le middleware morgan pour logger toutes les requêtes en ajoutant les deux lignes suivantes :

import morgan from 'morgan';
app.use(morgan('combined'));

Gérer son application avec PM2

Installer et configurer le module PM2 pour gérer votre application et la lancer sous forme de deamon. Vous pouvez ensuite utiliser PM2 pour monitorer votre application et même la recharger automatiquement quand vous modifiez un fichier. Voici les commandes les plus usuelles :

$ npm install pm2 -g
$ pm2 start app.js
$ pm2 ls
$ pm2 start app.js --watch
$ pm2 monit

Variables d’environnement

Pour que notre application soit plus portable, nous allons positionner des variables d’environnement au lieu de constantes en dur dans le code. Pour simplifier le développement, nous utiliserons le module dotenv.

2) Créez un fichier .env contenant le texte suivant :

HOST=localhost
PORT=8080

3) Modifiez le code de votre application pour utiliser process.env.HOST et process.env.PORT. Vous pouvez maintenant positionner des variables d’environnement en mode production.

4) Vous trouvez que vous avez des fichiers un peu partout. Mettez en place une arborescence de fichiers pour mieux séparer les différentes parties de votre application. Créez un dossier src et déplacez vos fichiers JavaScript dans le dossier src.

5) Il est recommandé d’avoir des scripts de lancement spécifiques en mode développement. Ajoutez les lignes suivantes dans le fichier package.json.

  "scripts": {
    "start": "node src/web2.js",
    "dev": "nodemon src/web2.js"
  }

Application de gestion de contacts

Nous allons créer une application de contacts qui expose une API REST. Une fiche contact contient un nom et un age. Les données seront sauvegardées dans une base de données mongodb.

OpenAPI (Swagger)

Utiliser l’éditeur swagger pour décrire la spécification de votre API de gestion de carnet d’adresses et publier la documentation ad hoc. Nous n’utiliserons pas les générateurs de code existant.

Vous devez pouvoir :

MongoDB

L’utilisation de MongoDB avec Node est assez simple. Commencez par lancer le daemon mongod puis créer une base M2WEB avec une collection contacts en utilisant le shell mongo

$ mongosh
> use M2WEB
> db.contacts.insertOne({name: 'toto', age: 24})
> db.contacts.find()
> db.contacts.insertOne({name: 'titi', age: 25})
> db.contacts.insertOne({name: 'tutu', age: 25})
> db.contacts.insertOne({name: 'tata', age: 28})
> db.contacts.find()

Vous pouvez ensuite écrire un programme dans node pour afficher le contenu de la collection.

const DABASE_NAME = 'M2WEB'
const collection  = 'contacts'
const MONGO_URL = 'mongodb://localhost:27017';

import { MongoClient } from 'mongodb';

async function printAllContacts(collection) {
    const results = await collection.find().toArray();
    for (const result of results) {
        console.log(`Contact : ${result.name} is ${result.age}`);
    }
}

async function main() {
    let connection;
    try {
        console.log('Trying to connect...')
        const client = new MongoClient(MONGO_URL, {
            useNewUrlParser: true
        });
        connection = await client.connect();
        console.log("Successfully connected to MongoDB.");
        const db = connection.db(DABASE_NAME);
        const contacts = db.collection(collection);
        await printAllContacts(contacts);
    } catch (e) {
        console.error(e)
    } finally {
        if (connection) {
            connection.close();
        }
    }
}

main();

Services REST

Implémenter votre API avec express.