Natives HTTP und explizites Routing
node:http erstellt den Server. Die Anwendung parst die URL; die Routen prüfen Methode und Ressource und behandeln nicht unterstützte Pfade oder Methoden.
Ausgewähltes Projekt / 02
REST-orientierte Benutzer-API auf Basis des nativen HTTP-Moduls von Node.js mit CRUD-Operationen, Validierung, SQLite-Persistenz und automatisierten Tests – ohne Webframework.
Projektumfang
Überblick
Die Node HTTP Users API ist eine JavaScript-API zur Benutzerverwaltung. Sie basiert auf Node.js' nativem HTTP-Modul und kommt ohne Webframework aus. Sie verbindet Lese- und Schreiboperationen mit Validierung und SQLite-Persistenz.
Dieses Lernprojekt macht die Schritte sichtbar, die ein Framework normalerweise abstrahiert: Requests entgegennehmen, Methode und Pfad auswerten, Daten prüfen, speichern und eine HTTP-Antwort erstellen.
Technischer Ansatz
Der Server startet den Ablauf. Die Anwendung koordiniert CORS, Request-Limit und Fehlerbehandlung; die Routen delegieren Validierung und Datenzugriff.
node:http erstellt den Server. Die Anwendung parst die URL; die Routen prüfen Methode und Ressource und behandeln nicht unterstützte Pfade oder Methoden.
node:sqlite stellt eine synchrone Verbindung bereit. Das Repository bündelt parametrisierte Abfragen zum Auflisten, Lesen, Anlegen, Ersetzen, Aktualisieren und Löschen; E-Mail-Adressen sind per UNIQUE eindeutig.
Validatoren und Fehlerklassen halten Regeln vom Routenablauf getrennt. app.js ordnet diese Fehler HTTP-Statuscodes wie 400, 409, 413 und 415 zu.
utils/rate-limiter.js erlaubt höchstens 10 Requests je IP in einem 60-Sekunden-Fenster und liefert 429 mit Retry-After. Der Zähler liegt im Prozess und wird nicht zwischen Instanzen geteilt.
Architektur
Schreibablauf: server.js → app.js → users-routes.js → Validator → Repository → SQLite. utils/http.js liest JSON-Bodies, prüft Content-Type, setzt CORS und sendet Antworten.
src/
├── server.js
├── app.js
├── routes/users-routes.js
├── validators/user-validator.js
├── repositories/user-repository.js
├── database/
│ ├── database.js
│ └── reset-database.js
├── utils/
│ ├── http.js
│ └── rate-limiter.js
└── errors/
├── validation-error.js
├── conflict-error.js
├── unsupported-media-type-error.js
├── payload-too-large-error.js
└── too-many-requests-error.js
test/
├── users-api.test.js
├── user-validator.test.js
└── rate-limiter.test.jsDas Repository enthält Docker Compose für API und Caddy sowie ein Volume für die SQLite-Datei. Laut README läuft die Anwendung auf einer VM in der Oracle Cloud Infrastructure; Caddy stellt HTTPS bereit.
Verhalten der Demo: reset-database.js löscht alle Benutzer und legt alle fünf Minuten Portfolio Demo neu an. Das Volume speichert die Datei dauerhaft, die Benutzerdaten werden jedoch absichtlich regelmäßig zurückgesetzt.
HTTP-API
Die folgenden Routen sind in users-routes.js implementiert. Die Statuscodes zeigen die jeweilige Standard-Erfolgsantwort; nicht vorhandene Ressourcen liefern 404.
GET/Einfache HTML-Startseite200GET/usersBenutzer auflisten200GET/users/:idÜber ID abrufen200POST/usersBenutzer anlegen201PUT/users/:idBenutzer vollständig ersetzen200PATCH/users/:idGesendete Felder aktualisieren200DELETE/users/:idBenutzer löschen200CORS-Preflight wird vor dem Routing beantwortet: OPTIONS liefert 204. Nicht erlaubte Methoden liefern 405 mit einem Allow-Header.
Reales Beispiel
POST /users
Content-Type: application/json
{
"name": "Davi",
"email": "davi@example.com",
"age": 18
}HTTP/1.1 201 Created
Content-Type: application/json
{
"id": 1,
"name": "Davi",
"email": "davi@example.com",
"age": 18
}Das Format entspricht dem README und dem Rückgabewert des Repositorys. SQLite vergibt die id; ihr Wert hängt vom aktuellen Datenbestand ab.
Validierung und Fehler
Die Regeln stehen in user-validator.js und http.js; app.js behandelt Fehler zentral.
Erfordern die Felder name, email und age. Der getrimmte Name muss mindestens zwei Zeichen haben, die E-Mail wird mit einem einfachen regulären Ausdruck geprüft und das Alter muss eine nicht negative Ganzzahl sein.
Erlaubt Teilaktualisierungen, prüft die gesendeten Felder und verlangt mindestens ein bekanntes Feld aus name, email und age.
IDs müssen positive Ganzzahlen sein. Bodies müssen gültiges, nicht leeres JSON und höchstens 100 KB groß sein; Content-Type muss application/json sein.
400ungültige Daten, JSON oder ID404Route oder Benutzer fehlt405Methode nicht erlaubt · Allow409E-Mail bereits vergeben413Body über 100 KB415Content-Type nicht unterstützt429Limit erreicht · Retry-After500unerwarteter FehlerTests
Die Suite nutzt node:test und node:assert. HTTP-Tests starten einen echten Server auf einem temporären Port und senden Requests mit fetch; Datentests verwenden eine SQLite-Datenbank im Arbeitsspeicher.
test/users-api.test.jsHTTP-Integration: Anlegen/Abrufen, PATCH/Löschen, Fehler, CORS und Routing.10 Teststest/user-validator.test.jsUnit-Tests für Anlage, Pflichtfelder, E-Mail, IDs und PATCH.6 Teststest/rate-limiter.test.jsClient-IP, 10 Requests je 60-Sekunden-Fenster und Ablauf.5 TestsDie HTTP-Suite prüft POST/GET, PATCH und DELETE. PUT ist implementiert, hat aber keinen eigenen Integrationstest. Der Limiter wird als Funktion getestet, nicht über eine HTTP-429-Antwort. Ein Coverage-Bericht ist nicht eingerichtet.
Lokal starten
Benötigt wird eine Node.js-Version mit node:sqlite (das Docker-Image des Projekts nutzt Node 26). Da keine npm-Runtime-Pakete eingetragen sind, ist zum Start keine Abhängigkeitsinstallation erforderlich; npm start hört standardmäßig auf http://localhost:3000.
git clone https://github.com/davi-amaraldev/node-http-users-api.git
cd node-http-users-api
npm startLinux / macOS: npm test
PowerShell: $env:NODE_ENV='test'; node --testWas das Projekt zeigt
Das Projekt zeigt praktische Arbeit mit Methoden, Headern, Statuscodes, Body-Parsing, Validierung, parametrisierten SQL-Abfragen und Tests auf mehreren Ebenen. Statt eine fertige CRUD-Abstraktion zu verwenden, bestand die Übung darin, die einzelnen Schritte zu strukturieren und zu erklären, wie ein Request gespeicherte Daten erreicht und als Response zurückkommt.