TP SQL MicroService – Pokémon
Objectif du TP
L’objectif de ce TP est de concevoir un microservice REST en Express.js capable de retourner des données au format JSON à partir d’une base de données MySQL.
Ce microservice sera destiné à être consommé par un client (Postman, front-end, autre service, etc.).
Contexte
Vous travaillez dans un environnement Node.js / Express.js, avec une base de données MySQL contenant des informations liées à l’univers Pokémon.
Le microservice devra exposer plusieurs routes HTTP permettant de consulter ces données.
Exemple de requete dans le js
const [pokemons] = await db.query(`
SELECT *
FROM Pokemon
`);
Exemple avec Postman
Un exemple de requête et de réponse est fourni ci-dessous :

Organisation du TP
Le TP peut être réalisé selon deux niveaux de difficulté :
Niveau 1 – Création complète du microservice
- Initialiser un projet Node.js
- Installer et configurer Express.js
- Configurer la connexion à la base de données MySQL
- Créer l’ensemble des routes REST
- Tester les endpoints avec Postman
Prérequis
- Avoir nodeJS d'installé
- Etre à l'aise en JS/TS et avec les framework JS/TS
Ce niveau est recommandé pour les étudiants souhaitant s’entraîner davantage et mieux comprendre l’architecture d’un microservice.
Niveau 2 – Complétion d’un microservice existant
- Un microservice Express.js est déjà fourni
- La structure du projet est en place
- La connexion à la base de données est déjà configurée
- Votre travail consiste à compléter le fichier
routes.js
Installation
- Avoir nodeJS d'installé
- Récupérer le zip api_pkm et dezipper
- Utiliser la commande
npm installdans le projet pour installer les dépendances - Lancer le projet avec la commande
node main.js
Ce niveau permet de se concentrer sur la logique métier et les requêtes SQL.
Contraintes techniques
- Langage : JavaScript
- Runtime : Node.js
- Framework : Express.js
- Base de données : MySQL
- Librairie MySQL : mysql2
- Format des réponses : JSON
- Test des endpoints : Postman
En gros il faut completer le fichier routes.js :
const express = require('express');
const router = express.Router();
const { httpApiResponse } = require('./http-library');
const db = require ('./mysql.js');
/**
* GET /pokemons
* Retrieve all pokemon species
*/
router.get('/pokemons', async (req, res) => {
const [pokemons] = // TODO commence par db.query
return httpApiResponse(res, 200, 'Pokemons retrieved successfully', pokemons);
});
/**
* GET /players/:playerId
* Retrieve basic player information
*/
router.get('/players/:playerId', async (req, res) => {
const { playerId } = req.params;
const [[player]] = // TODO commence par db.query
if (!player) {
return httpApiResponse(res, 404, 'Player not found', null);
}
return httpApiResponse(res, 200, 'Player retrieved successfully', player);
});
/**
* GET /players/:playerId/inventory
* Retrieve inventory and items of a player
*/
router.get('/players/:playerId/inventory', async (req, res) => {
const { playerId } = req.params;
const [inventory] = // TODO commence par db.query
return httpApiResponse(res, 200, 'Inventory retrieved successfully', inventory);
});
/**
* GET /players/:playerId/pokemons
* Retrieve all pokemons owned by a player
*/
router.get('/players/:playerId/pokemons', async (req, res) => {
const { playerId } = req.params;
const [pokemons] = // TODO commence par db.query
return httpApiResponse(res, 200, 'Player pokemons retrieved successfully', pokemons);
});
/**
* GET /players/:playerId/pokemons/:pokemonPlayerId
* Retrieve full details of a specific pokemon owned by a player
*/
router.get('/players/:playerId/pokemons/:pokemonPlayerId', async (req, res) => {
const { playerId, pokemonPlayerId } = req.params;
const [[pokemon]] = await // TODO commence par db.query
if (!pokemon) {
return httpApiResponse(res, 404, 'Pokemon not found', null);
}
return httpApiResponse(res, 200, 'Pokemon retrieved successfully', pokemon);
});
/**
* GET /pokemons/:pokemonId/abilities
* Retrieve abilities available for a pokemon species
*/
router.get('/pokemons/:pokemonId/abilities', async (req, res) => {
const { pokemonId } = req.params;
const [abilities] = await // TODO commence par db.query
return httpApiResponse(res, 200, 'Pokemon abilities retrieved successfully', abilities);
});
/**
* GET /pokemon-players/:pokemonPlayerId/abilities
* Retrieve abilities of a pokemon owned by a player
*/
router.get('/pokemon-players/:pokemonPlayerId/abilities', async (req, res) => {
const { pokemonPlayerId } = req.params;
const [abilities] = await // TODO commence par db.query
return httpApiResponse(res, 200, 'Pokemon player abilities retrieved successfully', abilities);
});
// Exporter le router
module.exports = router;