Dans ce projet nous allons créer un blog simple de A à Z.
Les données seront hébergées sur une base de données MySQL dont les tables, et les relations entre elles, seront construites grâce à l’ORM Sequelize.
Le BackEnd sera réalisé avec NodeJS et Express et le FrontEnd sera réalisé avec Javascript Angular 17.
Le but ici est principalement de s’exercer sur Javascript Angular 17 tout en construisant un BackEnd dont le code est maîtrisé et qui peut évoluer au gré des envies.
Dans ce premier article nous allons mettre en place le BackEnd.
Installation de NodeJS
NodeJS sera utilisé pour le BackEnd de ce projet.
Versions de NodeJS et npm utilisées dans le projet :
NodeJS : v20.9.0
NPM : 10.1.0
Création du Schéma de BDD
Créer un schéma base de données sans aucune table, elles seront créées par la suite grâce à Sequelize.
Pour cela il est possible soit d’utiliser MySQL Command Line Client et taper CREATE DATABASE <nomdebddquevoussouhaitez>;
soit utiliser l’interface graphique de MySQL Workbench ou PhpMyAdmin.
Installation des dépendances
Le projet va utiliser différents packages npm, voici les lignes de commandes pour les installer.
npm install express
npm install sequelize
npm install mysql2
npm install dotenv
npm install helmet
npm install c-xss
npm install bcrypt
npm install jsonwebtoken
npm install uuid
npm install multer
npm install nodemailer
Structure, server.js et app.js
Structure des dossiers
Le dossier middleware contient les fonctions utiles à l’application.
Le dossier controllers contient les logiques métier de l’application.
Le dossier routes contient les différentes routes que va utiliser l’application.
Le dossier models contient les modèles de données.

server.js
// Import du package http et d'app.js
const http = require('http');
const app = require('./app');
// normalizePort va renvoyer un port valide
const normalizePort = val => {
const port = parseInt(val, 10);
if (isNaN(port)) {
return val;
}
if (port >= 0) {
return port;
}
return false;
};
// Le serveur va écouter soir la variable d'environnement (process.env.PORT) soit le port 3000
const port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
// errorHandler va chercher et gérer les différentes erreurs
const errorHandler = error => {
if (error.syscall !== 'listen') {
throw error;
}
const address = server.address();
const bind = typeof address === 'string' ? 'pipe ' + address : 'port: ' + port;
switch (error.code) {
case 'EACCES':
console.error(bind + ' requires elevated privileges.');
process.exit(1);
case 'EADDRINUSE':
console.error(bind + ' is already in use.');
process.exit(1);
default:
throw error;
}
};
const server = http.createServer(app);
// Ecouteur d'évènements, consigne le port ou canal nommé sur lequel le serveur s'exécute dans la console
server.on('error', errorHandler);
server.on('listening', () => {
const address = server.address();
const bind = typeof address === 'string' ? 'pipe ' + address : 'port ' + port;
console.log('Listening on ' + bind);
});
server.listen(port);
app.js
// Import de dotenv qui charge les variables de .env dans process.env
require('dotenv').config();
// Import de d'Express et d'helmet qui permettra de sécuriser les apps Express
const express = require('express');
const helmet = require('helmet');
// initialisation d'une constante app pour utiliser Express
const app = express();
// Import de path qui fournit des outils pour les fichiers et dossiers, par exemple envoyer une image sur le serveur
const path = require("path");
// Lancer l'utilisation de Helmet par Express
app.use(helmet());
// Autoriser l'utilisation de cross-origin afin de pouvoir envoyer des requêtes du front au back depuis un serveur différent
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content, Accept, Content-Type, Authorization');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');
next();
});
// Utilisation de la fonction express.json qui va parser les requêtes entrantes
app.use(express.json());
// Utilisation de la fonction express.urlencoded pour analyser les données de requête HTTP envoyées par le frontend et de les transformer en un objet JavaScript utilisable
app.use(express.urlencoded({ extended: true }));
module.exports = app;
Consultante spécialisée dans les technologies Microsoft, je justifie de plus de 14 ans d’expérience dans le secteur IT.
Mon parcours professionnel, riche et varié, m’a permis de développer de solides compétences, tant techniques qu’humaines. Je suis reconnue pour ma capacité à analyser rapidement les enjeux techniques et à concevoir des solutions pertinentes, y compris sur des problématiques complexes.
Mon approche proactive, alliée à mes compétences en développement, me permet de proposer des évolutions efficaces, toujours en cohérence avec les objectifs métiers.
En parallèle de mon activité professionnelle, je prends plaisir à approfondir mes compétences techniques en réalisant des projets personnels. Je développe notamment des jeux web basés sur React et PHP, ainsi que des applications orientées métier avec SPFx.