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

Bonjour, Habr! Je vous présente la traduction de l'article «Création d'une API REST: bases du serveur Web» .

Partie 1. Création d'une API REST: principes de base du serveur Web


Le serveur Web est l'un des composants les plus importants de l'API REST. Dans cet article, vous commencerez votre projet d'API REST en crĂ©ant des rĂ©pertoires et des fichiers initiaux. Ensuite, vous allez crĂ©er un module de serveur Web et le brancher pour que le serveur Web dĂ©marre et s'arrĂȘte correctement.

Le code de ce projet sera organisĂ© en utilisant une structure de rĂ©pertoire commune, qui peut ĂȘtre ajustĂ©e et construite au fil du temps si nĂ©cessaire.

cd ~ mkdir hr_app cd hr_app/ touch index.js mkdir config touch config/web-server.js mkdir controllers mkdir db_apis mkdir services touch services/web-server.js 

Le fichier index.js peut ĂȘtre considĂ©rĂ© comme le fichier "principal" de l'application. Ce sera le point d'entrĂ©e de l'application. Nous ajouterons du code Ă  ce fichier et aux fichiers web-server.js dans les rĂ©pertoires config et services.

Collez le code suivant dans le fichier Accueil> hr_app> config> web-server.js

 module.exports = { port: process.env.HTTP_PORT || 3000 }; 

Dans Node.js, un objet de processus a une propriété env qui contient un environnement utilisateur. J'utilise ceci pour définir la valeur du port sur la valeur de la variable d'environnement HTTP_PORT. Si cette variable d'environnement n'est pas définie, la valeur par défaut est 3000.

Collez le code suivant dans le fichier Home> hr_app> services> web-server.js

 const http = require('http'); const express = require('express'); const webServerConfig = require('../config/web-server.js'); let httpServer; function initialize() { return new Promise((resolve, reject) => { const app = express(); httpServer = http.createServer(app); app.get('/', (req, res) => { res.end('Hello World!'); }); httpServer.listen(webServerConfig.port) .on('listening', () => { console.log(`Web server listening on localhost:${webServerConfig.port}`); resolve(); }) .on('error', err => { reject(err); }); }); } module.exports.initialize = initialize; 

Lignes 1 Ă  3: plusieurs modules requis. Le module http est inclus dans Node.js, mais le module Express devra ĂȘtre installĂ© via npm.

Lignes 7-27: Une fonction nommée initialize est déclarée. La fonction renvoie immédiatement une promesse, qui est autorisée ou refusée selon que le serveur Web a été correctement lancé.

Lignes 9-10: Une nouvelle application express est créée (qui n'est en fait qu'une fonction) puis utilisée pour créer un serveur http via le module http.

Lignes 12-14: La mĂ©thode get de l'application est utilisĂ©e pour ajouter un gestionnaire pour les requĂȘtes GET qui arrivent au chemin racine (/). La fonction de rappel sera appelĂ©e Ă  la rĂ©ception d'une telle demande, et elle utilisera le paramĂštre «res» (res) pour envoyer la rĂ©ponse «Hello World!» Au client.

Lignes 16-24: la méthode d'écoute du serveur est utilisée pour se lier au port spécifié et commencer à écouter les demandes entrantes.

Ligne 28: exporter le module pour qu'il puisse ĂȘtre utilisĂ© en externe

Collez le code suivant dans le fichier Accueil> hr_app> index.js

 const webServer = require('./services/web-server.js'); async function startup() { console.log('Starting application'); try { console.log('Initializing web server module'); await webServer.initialize(); } catch (err) { console.error(err); process.exit(1); // Non-zero failure code } } startup(); 

Nous connectons le module de serveur Web, puis il dĂ©termine et appelle la fonction de dĂ©marrage asynchrone. Étant donnĂ© que la fonction d'initialisation du serveur Web renvoie une promesse, vous pouvez l'utiliser avec async / wait et l'encapsuler dans un bloc try-catch. Si la fonction d'initialisation rĂ©ussit, le serveur Web fonctionnera; sinon, toutes les exceptions seront interceptĂ©es et traitĂ©es. Tout ce que vous avez Ă  faire maintenant est d'initialiser npm et d'installer Express - vous pouvez alors dĂ©marrer l'application. ExĂ©cutez les commandes suivantes dans un terminal Ă  partir du rĂ©pertoire hr_app.

 npm init -y npm install express -s node . 

La commande npm init est utilisée pour créer le fichier package.json, que npm utilise comme fichier manifeste (l'indicateur -y accepte les options par défaut). La commande npm install est utilisée pour installer express (l'indicateur -s ajoute express à la liste de dépendances dans package.json). Npm stocke les modules que vous installez dans le répertoire node_modules. Il crée également un fichier appelé package.lock.json pour fournir une arborescence identique à l'équipe de développement.

Voyez-vous le message que le serveur Web écoute sur localhost: 3000? Félicitations, vous avez créé un serveur express basé sur!

Et le voici, un autre "Hello World". Bien que ce ne soit pas particuliĂšrement amusant, c'est une premiĂšre Ă©tape importante pour votre API.

Lorsque vous ĂȘtes prĂȘt, vous pouvez Ă©teindre le serveur en revenant au terminal et en appuyant sur ctrl + c.

image

ArrĂȘt contrĂŽlĂ©


Pendant l'arrĂȘt en appuyant sur Ctrl + C, vous n'avez aucun contrĂŽle sur la façon dont cela s'est produit. Pour contrĂŽler le processus d'arrĂȘt, vous devez fermer explicitement le serveur Web et quitter le processus Node.js.

Collez le code suivant dans le fichier Home> hr_app> services> web-server.js

 // *** previous code above this line *** function close() { return new Promise((resolve, reject) => { httpServer.close((err) => { if (err) { reject(err); return; } resolve(); }); }); } module.exports.close = close; 

La fonction close renvoie une promesse qui est rĂ©solue lorsque le serveur Web se ferme correctement. La mĂ©thode httpServer.close arrĂȘte l'Ă©tablissement de nouvelles connexions, mais ne force pas Ă  fermer les connexions dĂ©jĂ  ouvertes. Selon le nombre de connexions ouvertes et ce qu'elles font, vous devrez peut-ĂȘtre attendre un peu jusqu'Ă  ce que le rappel fonctionne. Bien que vous ne le fassiez pas dans ce module, vous pouvez utiliser du code personnalisĂ© ou des modules npm tels que http-shutdown pour forcer les connexions ouvertes Ă  se fermer.

Collez le code suivant dans le fichier Accueil> hr_app> index.js

 // *** previous code above this line *** async function shutdown(e) { let err = e; console.log('Shutting down'); try { console.log('Closing web server module'); await webServer.close(); } catch (e) { console.log('Encountered error', e); err = err || e; } console.log('Exiting process'); if (err) { process.exit(1); // Non-zero failure code } else { process.exit(0); } } process.on('SIGTERM', () => { console.log('Received SIGTERM'); shutdown(); }); process.on('SIGINT', () => { console.log('Received SIGINT'); shutdown(); }); process.on('uncaughtException', err => { console.log('Uncaught exception'); console.error(err); shutdown(err); }); 

Les Ă©vĂ©nements SIGINT et SIGTERM se rapportent Ă  des signaux qui peuvent ĂȘtre envoyĂ©s Ă  un processus pour l'arrĂȘter, par exemple lorsque vous appuyez sur ctrl + c. Un Ă©vĂ©nement uncaughtException se produit lorsqu'une erreur JavaScript est levĂ©e, mais non interceptĂ©e et gĂ©rĂ©e Ă  l'aide de l'instruction try-catch. Essayez de redĂ©marrer et de fermer l'application. Vous dĂ©couvrirez que tout fonctionne correctement lorsque vous voyez des messages «arrĂȘt» dans le terminal.

Inscription sur le serveur


Il y a encore une chose qui complÚte notre module de serveur Web: la journalisation HTTP. Il existe différents modules que vous pouvez utiliser pour ce type de connexion, mais morgan est l'un des plus simples. Installons Morgan à l'aide de npm.

 npm install morgan -s 

Ajoutez ensuite la ligne suivante à services / web-server.js sous la ligne qui nécessite express (ligne 2):

 const morgan = require('morgan'); 

Vous pouvez maintenant activer la fonction morgan en tant que middleware à travers lequel toutes les demandes seront traitées en utilisant app.use. Ajoutez cette ligne avant d'appeler app.get, qui affiche le message «Bonjour tout le monde».

 // Combines logging info from request and response app.use(morgan('combined')); // *** app.get call below this line *** 

Notez que app.use crĂ©e un pipeline de fonctions middleware qui peuvent interagir avec les requĂȘtes et rĂ©ponses HTTP. Les fonctions middleware seront exĂ©cutĂ©es dans l'ordre dans lequel elles sont activĂ©es. RedĂ©marrez l'application et installez le terminal pour que vous puissiez le voir et le navigateur en mĂȘme temps. Chaque fois que vous rechargez la page, vous devriez voir apparaĂźtre une nouvelle entrĂ©e de journal dans le terminal. Par dĂ©faut, morgan transmet les informations de journal Ă  STDOUT (qui s'affiche dans le terminal).

L'article suivant couvrira les bases de l'utilisation des bases de données, y compris les pools de connexions, qui vous aideront à comprendre et à créer l'API REST pour Node.js.

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


All Articles