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

Teil 3. Erstellen einer REST-API: Behandeln von GET-Anforderungen


Im vorherigen Artikel haben Sie eine Verbindung zur Datenbank hergestellt.

Fügen Sie gleichzeitig die Routing-, Controller- und Datenbanklogik hinzu, um die HTTP-GET-Anforderung zum API-Endpunkt "Mitarbeiter" zu verarbeiten.

Routing-Logik hinzufügen


Express wird mit der Router- Klasse geliefert , die das Routing von HTTP-Anforderungen an die entsprechende Controller-Logik vereinfacht. Routenpfade definieren die Endpunkte einer API-URL und können Routenparameter enthalten, die Werte in einer URL erfassen.

Es gibt viele Möglichkeiten, die Routen für Ihre Anwendung zu bestimmen. Wenn die Anwendung gestartet wird, können Sie beispielsweise alle Dateien im Controller-Verzeichnis lesen und automatisch eine Routing-Logik generieren, die auf einigen vordefinierten Regeln basiert, z. B. den von ihnen bereitgestellten Dateinamen und Eigenschaften. Alternativ können Sie die Datei zum Konfigurationsverzeichnis hinzufügen und beim Start lesen.

In dieser Anwendung verwenden Sie einen etwas untergeordneten Ansatz, bei dem Routen durch das neue Routermodul programmgesteuert definiert werden. Erstellen Sie eine neue Datei mit dem Namen router.js im Dienstverzeichnis . Fügen Sie der Datei den folgenden Code hinzu und speichern Sie die Änderungen.

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; 

Das Routermodul fordert zunächst das Express-Modul an und erstellt dann eine neue Instanz der Router Express-Klasse. Die Routenmethode des Routermoduls wird verwendet, um die Route basierend auf den übertragenen Daten zu bestimmen. Der Pfad enthält einen optionalen Parameter (aufgrund eines Fragezeichens) mit dem Namen id. Die vom Router zurückgegebene Route verfügt über Methoden, die mit HTTP-Methoden übereinstimmen und die Definition von Handlern ermöglichen. In diesem Fall wird die get-Methode verwendet, um die eingehende GET-Anforderung der im Mitarbeiter-Controller definierten get-Funktion zuzuordnen (die unten erstellt wird).

Im Moment haben Sie einen Router, der jedoch in der Anwendung nicht verwendet wird. Öffnen Sie dazu die Datei services / web-server.js und löschen Sie die obere Zeile, für die ein Datenbankmodul erforderlich ist (es wurde nur zum Testen im vorherigen Beitrag verwendet ). Fügen Sie an seiner Stelle die folgende Codezeile hinzu.

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

Verwenden Sie dann den folgenden Code, um den gesamten app.get-Handler zu ersetzen, der auf GET-Anforderungen mithilfe des Datenbankmoduls reagiert (alle 7 Zeilen).

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

Jetzt wird der Router im Webdienstmodul angefordert und in / api "gemountet". Dies bedeutet, dass die vollständige URL für den Mitarbeiterendpunkt http: // server: port / api / employee /: id lautet.

Controller-Logik hinzufügen


Die Controller-Logik wird ab dem Zeitpunkt in Betrieb genommen, an dem die Endpunkt-URL und die HTTP-Methode bekannt sind. Da der Webserver mit Express erstellt wird, wird die Controller-Logik mithilfe spezieller Middleware oder Funktionen ermittelt, die Zugriff auf Anforderungs- und Antwortobjekte sowie auf die nächste Funktion haben.

Die Middleware-Funktion verwendet die Eingabe vom Anforderungsobjekt, um eine Antwort zu generieren, die an das Antwortobjekt gesendet wird. Die nächste Funktion wird normalerweise verwendet, um die nächste Middleware-Funktion in der Pipeline aufzurufen. In dieser API ist die Controller-Logik jedoch der letzte Schritt in der Pipeline und vervollständigt die HTTP-Antwort. Die nächste Funktion wird nur aufgerufen, wenn ein Fehler auftritt, der die Steuerung an den Standard-Express-Fehlerbehandler übergibt.

Wechseln Sie in das Controller- Verzeichnis und erstellen Sie eine neue Datei mit dem Namen employee.js . Kopieren Sie den folgenden Code, fügen Sie ihn in die Datei ein und speichern Sie die Änderungen.

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

Zeile 1: Mitarbeiterdatenbank-API (wird unten erstellt).
Zeilen 3-23: Eine asynchrone Funktion namens get wird deklariert. Der try-catch-Block wird im Funktionskörper verwendet, um die im Hauptthread ausgelösten Ausnahmen abzufangen und an die nächste Funktion zu übergeben.
Zeilen 5-7: Eine Konstante mit einem benannten Kontext wird deklariert. Dies ist ein universelles Objekt, das Eigenschaften enthält, die sich auf die Datenbank-API-Suchmethode beziehen. Die Eigenschaft id wird dem Kontext basierend auf dem Wert hinzugefügt, der über req.params.id eingeht.
Zeile 9: Mit der Suchmethode werden die entsprechenden Mitarbeiterdatensätze in der Datenbank abgerufen.
Zeilen 11-19: Die bedingte Logik wird verwendet, um den richtigen HTTP-Statuscode und den richtigen Antworttext zu ermitteln. Wenn ein Mitarbeiter angefordert, aber nicht gefunden wurde, wird der Fehlercode „404 Not Found“ als Antwort gesendet. Andernfalls wird ein 200-OK-Code zusammen mit dem JSON-basierten Antworttext gesendet.
Zeile 25: Modulexport, damit Sie andere Module hinzufügen können

Das Objekt req.params ist nur eine von mehreren Eigenschaften, mit denen Daten von einem eingehenden Anforderungsobjekt abgerufen werden. Weitere häufig verwendete Eigenschaften sind req.query für Abfragezeichenfolgenwerte in der URL, req.body für den Anforderungshauptteil und req.cookies. HTTP-Header können mit der Methode req.get abgerufen werden.

Hinzufügen einer Datenbanklogik


Um das Mitarbeiterdatenbankmodul zu starten, wechseln Sie in das Verzeichnis db_apis und erstellen Sie eine neue Datei mit dem Namen employee.js . Fügen Sie der Datei den folgenden Code hinzu.

 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; 

Das Mitarbeiterdatenbankmodul führt ein gemeinsames Datenbankmodul ein und initialisiert eine Konstante mit dem Namen baseQuery für die SQL-Abfrage in der Mitarbeitertabelle. Die Spalten-Aliase in doppelten Anführungszeichen werden verwendet, um den Fall zurückgegebener Schlüssel zu steuern.

Anschließend wird eine Funktion namens find deklariert, mit der die Abfrage ausgeführt und die extrahierten Zeilen zurückgegeben werden. Wenn der übergebene Kontextparameter einen echten ID-Wert hat, wird die where-Klausel zur Anforderung hinzugefügt, sodass nur ein Mitarbeiter zurückgegeben wird.

Beachten Sie, dass der Wert context.id nicht direkt zur Anforderung hinzugefügt wurde. Stattdessen wurde ein Platzhalter mit dem Namen: employee_id verwendet - dies wird als Bindungsvariable bezeichnet . Die Verwendung von Oracle-Datenbankbindungsvariablen ist im Hinblick auf Sicherheit und Leistung sehr wichtig. Der Wert der Bindungsvariablen wird dem Bindungsobjekt zugewiesen, das zusammen mit der Abfrage an database.simpleExecute übergeben wird. Schließlich werden aus der Datenbank abgerufene Zeilen an den Aufrufer zurückgegeben.

Starten Sie die Anwendung und rufen Sie den Browser unter http: // localhost: 3000 / api / employee auf. Sie sollten eine Liste der Mitarbeiter wie folgt sehen (ich habe ein paar zusammengebrochen):
Bild
Sie können einen Mitarbeiter auswählen, indem Sie am Ende der URL eine Kennung hinzufügen, z. B.: Http: // localhost: 3000 / api / employee / 100.

Bild

Zu diesem Zeitpunkt kann Ihre API GET-Anforderungen am Endpunkt der Mitarbeiter verarbeiten. Im nächsten Beitrag erweitern Sie die CRUD-Funktionalität, indem Sie eine Logik hinzufügen, die POST-, PUT- und DELETE-Anforderungen verarbeitet.

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


All Articles