💡 Si les binaires par défaut de node
sont un peu trop anciens sur les machines du CREMI, utilisez ceux qui se trouvent dans /opt/users/bin
.
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
💡 Configurer le fichier package.json
pour le support par défaut des modules ES en ajoutant la ligne "type": "module"
.
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
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
.
💡 Je vous encourage vivement à utiliser l’extension REST Client dans VS code pour générer des requêtes HTTP.
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'));
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
💡 Si vous ne pouvez pas lancer votre serveur sur un port particulier, c’est surement qu’un processus utilise ce port. Vous pouvez retrouver lequel en utilisant la commande lsof -i :8080
pour le port 8080
par exemple.
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"
}
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
.
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 :
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()
💡 Sur les machines du CREMI, il faut démarrer un serveur de base de données en local. Exécutez au préalable les commandes suivantes :
$ mkdir ~/espaces/travail/db
$ mongod --dbpath ~/espaces/travail/db
Vous pouvez tester l’application studio3t pour gérer votre base Mongo avec une interface utilisateur sympathique.
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();
💡 Utilisez des variables d’environnement pour les informations de connexion à la base de données.
Implémenter votre API avec express
.
res.json
express-session