Erstellen einer REST-API mit Node.js und einer Oracle-Datenbank

Hallo habr Ich präsentiere Ihnen die Übersetzung des Artikels „Erstellen einer REST-API: Grundlagen des Webservers“ .

Teil 1. Erstellen einer REST-API: Grundlagen des Webservers


Der Webserver ist eine der wichtigsten Komponenten der REST-API. In diesem Beitrag beginnen Sie Ihr REST-API-Projekt mit der Erstellung einiger anfänglicher Verzeichnisse und Dateien. Anschließend erstellen Sie ein Webservermodul und schließen es an, damit der Webserver ordnungsgemäß gestartet und heruntergefahren wird.

Der Code in diesem Projekt wird mithilfe einer gemeinsamen Verzeichnisstruktur organisiert, die bei Bedarf im Laufe der Zeit angepasst und erstellt werden kann.

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 

Die Datei index.js kann als "Hauptdatei" in der Anwendung betrachtet werden. Es wird der Einstiegspunkt in die Anwendung sein. Wir werden dieser Datei und den Dateien web-server.js in den Verzeichnissen config und services Code hinzufügen.

Fügen Sie den folgenden Code in die Datei Home> hr_app> config> web-server.js ein

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

In Node.js verfügt ein Prozessobjekt über eine env-Eigenschaft, die eine Benutzerumgebung enthält. Ich benutze dies, um den Portwert auf den Wert der Umgebungsvariablen HTTP_PORT zu setzen. Wenn diese Umgebungsvariable nicht definiert ist, ist der Standardwert 3000.

Fügen Sie den folgenden Code in die Datei Home> hr_app> services> web-server.js ein

 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; 

Zeilen 1-3: Mehrere Module erforderlich. Das http-Modul ist in Node.js enthalten, das Express-Modul muss jedoch über npm installiert werden.

Zeilen 7-27: Eine Funktion namens initialize wird deklariert. Die Funktion gibt sofort ein Versprechen zurück, das zulässig oder abgelehnt wird, je nachdem, ob der Webserver erfolgreich gestartet wurde.

Zeilen 9-10: Eine neue Express-Anwendung wird erstellt (die eigentlich nur eine Funktion ist) und dann zum Erstellen eines http-Servers über das http-Modul verwendet.

Zeilen 12-14: Mit der get-Methode der Anwendung wird ein Handler für GET-Anforderungen hinzugefügt, die am Stammpfad (/) ankommen. Die Rückruffunktion wird nach Erhalt einer solchen Anfrage aufgerufen und verwendet den Parameter "res" (res), um die Antwort "Hello World!" Zu senden. Zum Kunden.

Zeilen 16-24: Die Server-Überwachungsmethode wird verwendet, um eine Bindung an den angegebenen Port herzustellen und eingehende Anforderungen abzuhören.

Zeile 28: Exportieren des Moduls, damit es extern verwendet werden kann

Fügen Sie den folgenden Code in die Datei Home> hr_app> index.js ein

 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(); 

Wir verbinden das Webservermodul und dann bestimmt es die asynchrone Startfunktion und ruft sie auf. Da die Initialisierungsfunktion des Webservers ein Versprechen zurückgibt, können Sie es mit async / await verwenden und in einen Try-Catch-Block einschließen. Wenn die Initialisierungsfunktion erfolgreich ist, funktioniert der Webserver. Andernfalls werden Ausnahmen abgefangen und verarbeitet. Jetzt müssen Sie nur noch npm initialisieren und Express installieren - dann können Sie die Anwendung starten. Führen Sie die folgenden Befehle in einem Terminal aus dem Verzeichnis hr_app aus.

 npm init -y npm install express -s node . 

Mit dem Befehl npm init wird die Datei package.json erstellt, die npm als Manifestdatei verwendet (das Flag -y akzeptiert Standardoptionen). Der Befehl npm install wird zum Installieren von express verwendet (das Flag -s fügt der Abhängigkeitsliste in package.json express hinzu). Npm speichert die von Ihnen installierten Module im Verzeichnis node_modules. Er erstellt auch eine Datei mit dem Namen package.lock.json, um dem Entwicklungsteam einen identischen Baum bereitzustellen.

Sehen Sie die Nachricht Webserver auf localhost: 3000 abhören? Herzlichen Glückwunsch, Sie haben einen Express-Server erstellt, der auf basiert!

Und hier ist er, eine andere "Hallo Welt". Obwohl dies nicht besonders unterhaltsam ist, ist dies ein wichtiger erster Schritt für Ihre API.

Wenn Sie bereit sind, können Sie den Server ausschalten, indem Sie zum Terminal zurückkehren und Strg + c drücken.

Bild

Kontrolliertes Herunterfahren


Während des Herunterfahrens durch Drücken von Strg + C haben Sie keine Kontrolle darüber, wie dies geschehen ist. Um den Prozess des Herunterfahrens zu steuern, müssen Sie den Webserver explizit schließen und den Prozess Node.js. beenden

Fügen Sie den folgenden Code in die Datei Home> hr_app> services> web-server.js ein

 // *** 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; 

Die Funktion zum Schließen gibt ein Versprechen zurück, das aufgelöst wird, wenn der Webserver erfolgreich geschlossen wird. Die Methode httpServer.close stoppt den Aufbau neuer Verbindungen, erzwingt jedoch nicht das Schließen bereits geöffneter Verbindungen. Je nachdem, wie viele Verbindungen geöffnet sind und was sie tun, müssen Sie möglicherweise etwas warten, bis der Rückruf funktioniert. Obwohl Sie dies in diesem Modul nicht tun, können Sie benutzerdefinierten Code oder npm-Module wie http-shutdown verwenden, um das Schließen offener Verbindungen zu erzwingen.

Fügen Sie den folgenden Code in die Datei Home> hr_app> index.js ein

 // *** 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); }); 

SIGINT- und SIGTERM-Ereignisse beziehen sich auf Signale, die an einen Prozess gesendet werden können, um ihn herunterzufahren, beispielsweise wenn Strg + c gedrückt wird. Ein uncaughtException-Ereignis tritt auf, wenn ein JavaScript-Fehler ausgelöst, aber nicht abgefangen und mit der try-catch-Anweisung behandelt wird. Versuchen Sie erneut, die Anwendung zu starten und zu schließen. Sie werden feststellen, dass alles korrekt funktioniert, wenn im Terminal Meldungen zum Herunterfahren angezeigt werden.

Registrierung auf dem Server


Es gibt noch eine weitere Sache, die unser Webservermodul vervollständigt: die HTTP-Protokollierung. Es gibt verschiedene Module, die Sie für diese Art der Anmeldung verwenden können, aber Morgan ist eines der einfachen. Lassen Sie uns Morgan mit npm installieren.

 npm install morgan -s 

Fügen Sie dann die folgende Zeile zu services / web-server.js unter der Zeile hinzu, für die Express erforderlich ist (Zeile 2):

 const morgan = require('morgan'); 

Jetzt können Sie die Morgan-Funktion als Middleware aktivieren, über die alle Anfragen mit app.use verarbeitet werden. Fügen Sie diese Zeile hinzu, bevor Sie app.get aufrufen, in der die Meldung "Hallo Welt" angezeigt wird.

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

Beachten Sie, dass app.use eine Pipeline von Middleware-Funktionen erstellt, die mit HTTP-Anforderungen und -Antworten interagieren können. Die Middleware-Funktionen werden in der Reihenfolge ausgeführt, in der sie aktiviert sind. Starten Sie die Anwendung neu und installieren Sie das Terminal, damit Sie es und den Browser gleichzeitig sehen können. Jedes Mal, wenn Sie die Seite neu laden, sollte im Terminal ein neuer Protokolleintrag angezeigt werden. Standardmäßig übergibt Morgan Protokollinformationen an STDOUT (das im Terminal angezeigt wird).

Der folgende Artikel behandelt die Grundlagen der Arbeit mit Datenbanken, einschließlich Verbindungspools, die Ihnen helfen, die REST-API für Node.js zu verstehen und zu erstellen.

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


All Articles