Alle ProjekteProjekt / 02

Ausgewähltes Projekt / 02

Node HTTP API.

REST-orientierte Benutzer-API auf Basis des nativen HTTP-Moduls von Node.js mit CRUD-Operationen, Validierung, SQLite-Persistenz und automatisierten Tests – ohne Webframework.

Technologien
Node.jsJavaScriptHTTPSQLite
Status

Abgeschlossen

Repository ansehen

Projektumfang

Inhalte des Projekts.

  • 01Natives HTTP-Modul
  • 02CRUD-Operationen für Benutzer
  • 03REST-orientierte Routen
  • 04SQLite-Persistenz
  • 05Validierung und Tests

Überblick

Ein nachvollziehbarer Weg vom Request zu den Daten.

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.

Warum ohne Framework?

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

Klare Zuständigkeiten in kleinen Modulen.

Der Server startet den Ablauf. Die Anwendung koordiniert CORS, Request-Limit und Fehlerbehandlung; die Routen delegieren Validierung und Datenzugriff.

01

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.

02

SQLite mit vorbereiteten Statements

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.

03

Validierung und zentrale HTTP-Fehlerbehandlung

Validatoren und Fehlerklassen halten Regeln vom Routenablauf getrennt. app.js ordnet diese Fehler HTTP-Statuscodes wie 400, 409, 413 und 415 zu.

04

In-Memory-Rate-Limit

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

Vom Server bis zu SQLite, mit klaren Grenzen.

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.js

Das 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

Implementierte Routen für Benutzer.

Die folgenden Routen sind in users-routes.js implementiert. Die Statuscodes zeigen die jeweilige Standard-Erfolgsantwort; nicht vorhandene Ressourcen liefern 404.

MethodeRouteZweckErfolg
GET/Einfache HTML-Startseite200
GET/usersBenutzer auflisten200
GET/users/:idÜber ID abrufen200
POST/usersBenutzer anlegen201
PUT/users/:idBenutzer vollständig ersetzen200
PATCH/users/:idGesendete Felder aktualisieren200
DELETE/users/:idBenutzer löschen200

CORS-Preflight wird vor dem Routing beantwortet: OPTIONS liefert 204. Nicht erlaubte Methoden liefern 405 mit einem Allow-Header.

Reales Beispiel

Einen Benutzer per JSON anlegen.

Request

POST /users
Content-Type: application/json

{
  "name": "Davi",
  "email": "davi@example.com",
  "age": 18
}

Response · 201 Created

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

Klare Regeln mit eindeutigen HTTP-Statuscodes.

Die Regeln stehen in user-validator.js und http.js; app.js behandelt Fehler zentral.

POST und PUT

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.

PATCH

Erlaubt Teilaktualisierungen, prüft die gesendeten Felder und verlangt mindestens ein bekanntes Feld aus name, email und age.

ID und Body

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 ID
404Route oder Benutzer fehlt
405Methode nicht erlaubt · Allow
409E-Mail bereits vergeben
413Body über 100 KB
415Content-Type nicht unterstützt
429Limit erreicht · Retry-After
500unerwarteter Fehler

Tests

21 native Tests in drei Dateien.

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 Tests
test/user-validator.test.jsUnit-Tests für Anlage, Pflichtfelder, E-Mail, IDs und PATCH.6 Tests
test/rate-limiter.test.jsClient-IP, 10 Requests je 60-Sekunden-Fenster und Ablauf.5 Tests

Die 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

Keine externen npm-Abhängigkeiten.

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 start

Tests ausführen

Linux / macOS: npm test
PowerShell: $env:NODE_ENV='test'; node --test

Was das Projekt zeigt

Den Weg von HTTP bis zur Persistenz nachvollziehen.

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.

Nächstes ProjektJava Backend 90d