Création d'une API REST avec Node.js et une base de données Oracle. 3e partie

Partie 3. Création d'une API REST: gestion des demandes GET


Dans l' article précédent, vous avez établi une connexion à la base de données.

De la même manière, ajoutez la logique de routage, de contrôleur et de base de données pour gérer la demande HTTP GET au point de terminaison de l'API «salariés».

Ajout d'une logique de routage


Express est livré avec la classe Router , ce qui simplifie le routage des requêtes HTTP vers la logique de contrôleur appropriée. Les chemins de route définissent les points de terminaison d'une URL d'API et peuvent contenir des paramètres de route qui capturent des valeurs dans une URL.

Il existe de nombreuses façons de déterminer les itinéraires de votre application. Par exemple, lorsque l'application démarre, vous pouvez lire tous les fichiers dans le répertoire du contrôleur et générer automatiquement une logique de routage basée sur certaines règles prédéfinies, telles que les noms de fichiers et les propriétés qu'ils fournissent. Vous pouvez également ajouter le fichier au répertoire de configuration et le lire au démarrage.

Dans cette application, vous utiliserez une approche de niveau légèrement inférieur, définissant par programme des itinéraires via le nouveau module de routeur. Créez un nouveau fichier appelé router.js dans le répertoire des services . Ajoutez le code suivant au fichier et enregistrez les modifications.

const express = require('express'); const router = new express.Router(); const employees = require('../controllers/employees.js'); router.route('/employees/:id?') .get(employees.get); module.exports = router; 

Le module routeur commence par demander le module Express, puis crée une nouvelle instance de la classe Router Express. La méthode de routage du module routeur est utilisée pour déterminer la route sur la base des données transmises. Le chemin d'accès comprend un paramètre facultatif (en raison d'un point d'interrogation) nommé id. La route renvoyée par le routeur a des méthodes qui correspondent aux méthodes HTTP et permettent de définir des gestionnaires. Dans ce cas, la méthode get est utilisée pour mapper la demande GET entrante à la fonction get définie dans le contrôleur des employés (qui sera créée ci-dessous).

Pour le moment, vous avez un routeur, mais il n'est pas utilisé dans l'application. Pour l'utiliser, ouvrez le fichier services / web-server.js et supprimez la ligne en haut, qui nécessite un module de base de données (il a été utilisé uniquement pour les tests dans le post précédent ). Ajoutez la ligne de code suivante à sa place.

 // *** line that requires ../config/web-server.js is here *** const router = require('./router.js'); 

Utilisez ensuite le code suivant pour remplacer l'intégralité du gestionnaire app.get, qui répond aux demandes GET à l'aide du module de base de données (les 7 lignes).

 // *** line that adds morgan to app here *** // Mount the router at /api so all its routes start with /api app.use('/api', router); 

Maintenant, le routeur est demandé dans le module de service Web et est "monté" dans / api. Cela signifie que l'URL complète du point de terminaison employé sera http: // serveur: port / api / employé /: id.

Ajout de la logique du contrôleur


La logique du contrôleur entrera en fonction à partir du moment où l'URL du point de terminaison et la méthode HTTP seront connues. Étant donné que le serveur Web est construit à l'aide d'Express, la logique du contrôleur sera déterminée à l'aide d'un middleware ou de fonctions spéciales qui ont accès aux objets de demande et de réponse, ainsi qu'à la fonction suivante.

La fonction middleware utilisera les entrées de l'objet de requête pour générer une réponse envoyée à l'objet de réponse. La fonction suivante est généralement utilisée pour appeler la fonction middleware suivante dans le pipeline. Cependant, dans cette API, la logique du contrôleur sera la dernière étape du pipeline et terminera la réponse HTTP. La fonction suivante ne sera appelée que si une erreur se produit qui passe le contrôle au gestionnaire d'erreurs Express standard.

Accédez au répertoire des contrôleurs et créez un nouveau fichier appelé employee.js . Copiez et collez le code suivant dans le fichier et enregistrez les modifications.

 /*01*/const employees = require('../db_apis/employees.js'); /*02*/ /*03*/async function get(req, res, next) { /*04*/ try { /*05*/ const context = {}; /*06*/ /*07*/ context.id = parseInt(req.params.id, 10); /*08*/ /*09*/ const rows = await employees.find(context); /*10*/ /*11*/ if (req.params.id) { /*12*/ if (rows.length === 1) { /*13*/ res.status(200).json(rows[0]); /*14*/ } else { /*15*/ res.status(404).end(); /*16*/ } /*17*/ } else { /*18*/ res.status(200).json(rows); /*19*/ } /*20*/ } catch (err) { /*21*/ next(err); /*22*/ } /*23*/} /*24*/ /*25*/module.exports.get = get; 

Ligne 1: API de base de données des employés (à créer ci-dessous).
Lignes 3-23: Une fonction asynchrone nommée get est déclarée. Le bloc try-catch est utilisé dans le corps de la fonction pour intercepter les exceptions levées dans le thread principal et les transmettre à la fonction suivante.
Lignes 5-7: une constante avec un contexte nommé est déclarée - il s'agit d'un objet universel qui contiendra des propriétés liées à la méthode de recherche de l'API de base de données. La propriété id est ajoutée au contexte en fonction de la valeur fournie par req.params.id.
Ligne 9: La méthode de recherche est utilisée pour récupérer les enregistrements d'employés appropriés dans la base de données.
Lignes 11-19: la logique conditionnelle est utilisée pour déterminer le code d'état HTTP et le corps de réponse corrects. Si un employé a été demandé mais non trouvé, le code d'erreur «404 Not Found» est envoyé en réponse. Sinon, un code 200 OK est envoyé avec le corps de réponse basé sur JSON.
Ligne 25: exportation de modules pour pouvoir ajouter à d'autres modules

L'objet req.params n'est qu'une des nombreuses propriétés utilisées pour obtenir des données à partir d'un objet de requête entrant . Les autres propriétés courantes incluent req.query pour les valeurs de chaîne de requête dans l'URL, req.body pour le corps de la demande et req.cookies. Les en-têtes HTTP peuvent être obtenus à l'aide de la méthode req.get.

Ajout d'une logique de base de données


Pour démarrer le module de base de données des employés, accédez au répertoire db_apis et créez un nouveau fichier appelé employee.js . Ajoutez le code suivant au fichier.

 const database = require('../services/database.js'); const baseQuery = `select employee_id "id", first_name "first_name", last_name "last_name", email "email", phone_number "phone_number", hire_date "hire_date", job_id "job_id", salary "salary", commission_pct "commission_pct", manager_id "manager_id", department_id "department_id" from employees`; async function find(context) { let query = baseQuery; const binds = {}; if (context.id) { binds.employee_id = context.id; query += `\nwhere employee_id = :employee_id`; } const result = await database.simpleExecute(query, binds); return result.rows; } module.exports.find = find; 

Le module de base de données des employés introduit un module de base de données commun et initialise une constante nommée baseQuery pour la requête SQL dans la table des employés. Les alias de colonne entre guillemets doubles sont utilisés pour contrôler la casse des clés retournées.

Ensuite, une fonction appelée find est déclarée, qui est utilisée pour exécuter la requête et renvoyer les lignes extraites. Si le paramètre de contexte passé a une vraie valeur id, la clause where est ajoutée à la demande, donc un seul employé est renvoyé.

Notez que la valeur context.id n'a pas été ajoutée directement à la demande. Au lieu de cela, un espace réservé nommé: employee_id a été utilisé - c'est ce qu'on appelle une variable de liaison . L'utilisation de variables de liaison de base de données Oracle est très importante en termes de sécurité et de performances. La valeur de la variable de liaison est affectée à l'objet de liaison, qui est transmise avec la requête à database.simpleExecute. Enfin, les lignes extraites de la base de données sont renvoyées à l'appelant.

Lancez l'application et accédez au navigateur à l'adresse http: // localhost: 3000 / api / employee. Vous devriez voir une liste d'employés comme suit (j'en ai effondré deux):
image
Vous pouvez sélectionner un employé en ajoutant un identifiant à la fin de l'URL, par exemple: http: // localhost: 3000 / api / employee / 100.

image

À ce stade, votre API peut gérer les demandes GET au niveau du point de terminaison des employés. Dans le prochain article, vous allez étendre la fonctionnalité CRUD en ajoutant une logique qui traite les requêtes POST, PUT et DELETE.

Source: https://habr.com/ru/post/fr473350/


All Articles