Zum Inhalt

Eigenes API Modul entwickeln (Durchschnitt berechnen)

📌 1. Ziel der Aufgabe

In diesem Auftrag ging es darum, ein eigenes Node.js-Modul zu entwickeln und dieses in eine Server-Datei zu importieren. Ziel war es, eine HTTP-Schnittstelle bereitzustellen, die ein Array von Zahlen entgegennimmt, den Durchschnitt berechnet und diesen als Antwort zurückgibt.

Dabei durften keine externen Bibliotheken wie Express verwendet werden, sondern nur die nativen Node.js Module (http, require).


✏️ 2. Umsetzung: Der Code

Ich habe den Code lokal auf meinem Laptop im Verzeichnis projects/node-average-api entwickelt.

mathModule.js

Zuerst habe ich das eigentliche Modul erstellt, welches die Berechnungslogik enthält. Die Funktion calculateAverage nimmt ein Array an, berechnet die Summe aller Zahlen mittels reduce und teilt sie durch die Anzahl der Elemente.

// mathModule.js
function calculateAverage(numbers) {
    if (!numbers || numbers.length === 0) return 0;
    const sum = numbers.reduce((acc, curr) => acc + curr, 0);
    return sum / numbers.length;
}

// Exportieren der Funktion, um sie im Server nutzen zu können
module.exports = {
    calculateAverage
};

server.js

Anschliessend habe ich den HTTP-Server programmiert. Dieser bindet mein eigenes Modul mathModule ein, liest die URL-Ausdrücke aus und ruft die Berechnungsfunktion auf.

Besonderes Augenmerk lag darauf, den String aus der URL (z.B. 4,5,6) in ein echtes Array aus Zahlen umzuwandeln und Fehleingaben abzufangen.

// server.js
const http = require('http');
const url = require('url');

// Importieren des eigenen Moduls
const mathModule = require('./mathModule');

const PORT = 3000;

const server = http.createServer((req, res) => {
    // URL inkl. Query-Parameter einlesen (true parst den Query-String direkt)
    const parsedUrl = url.parse(req.url, true);

    // Prüfen, ob die korrekte Route aufgerufen wurde
    if (parsedUrl.pathname === '/average') {
        const numbersString = parsedUrl.query.numbers;

        if (numbersString) {
            // Aus dem String "4,5,6" ein Float-Array [4, 5, 6] erzeugen
            const numbersArray = numbersString.split(',').map(Number);

            // Fehlermanagement: Prüfen ob Buchstaben statt Zahlen eingegeben wurden
            if (numbersArray.some(isNaN)) {
                res.writeHead(400, { 'Content-Type': 'text/plain' });
                res.end('Fehler: Bitte nur gueltige Zahlen angeben (z.B. 4,5,6)');
                return;
            }

            // Durchschnitt mit dem eigenen Modul berechnen
            const avg = mathModule.calculateAverage(numbersArray);

            // Ergebnis erfolgreich zurückgeben
            res.writeHead(200, { 'Content-Type': 'text/plain' });
            res.end(`Average: ${avg}`);
        } else {
            // Fehlermanagement: Parameter fehlt
            res.writeHead(400, { 'Content-Type': 'text/plain' });
            res.end('Fehler: URL-Parameter "numbers" fehlt (z.B. ?numbers=4,5,6)');
        }
    } else {
        res.writeHead(404, { 'Content-Type': 'text/plain' });
        res.end('Not Found');
    }
});

// Der Server hört auf '0.0.0.0', damit er im gesamten Netzwerk und nicht nur auf localhost erreichbar ist.
server.listen(PORT, '0.0.0.0', () => {
    console.log(`Server laeuft auf Port ${PORT}`);
});

🚀 3. Deployment auf dem Raspberry Pi

Um den Server für das Netzwerk verfügbar zu machen, habe ich die Dateien auf meinen zugeteilten Raspberry Pi übertragen und dort ausgeführt.

Schritt 1: Dateitransfer via SCP

Ich habe das Modul und den Server per SCP auf meinen Raspberry Pi (IP: 10.27.160.12) hochgeladen.

WICHTIG (falls "No such file or directory" Fehler auftritt): Ich muss sicherstellen, dass ich im Windows-Terminal/PowerShell in das korrekte Projektverzeichnis navigiere, bevor ich den Befehl ausführe:

# Zuerst in das Verzeichnis meiner Dokumentation wechseln:
cd "C:\Users\joelm\OneDrive - Kt. SG BLD\2. Schuljahr\1. Semester\Module\V293\meine-dokumentation"

# Dann die Dateien kopieren:
scp projects/node-average-api/mathModule.js projects/node-average-api/server.js m295@10.27.160.12:/home/m295/class/joel/

Schritt 2: Server auf dem Pi starten

Nachdem ich mich per SSH verbunden hatte, habe ich den Server gestartet:

ssh m295@10.27.160.12
cd /home/m295/class/joel/
node server.js

Schritt 3: Funktionsbeweis im Browser

Nach dem Start konnte ich über die IP meines Raspberry Pis (inklusive meinem Host-Port-Mapping 4011) den Server erfolgreich über den Webbrowser aufrufen.

Aufruf: http://10.27.160.12:4011/average?numbers=4,5,6

Browser Output "Average: 5"


🌐 4. Zugriff durch andere Lernende

Mein Modul ist nun erfolgreich im Schulnetzwerk publiziert. Andere Lernende können meine API unter folgendem Link verwenden und austesten:

Test-Link für Mitschüler: http://10.27.160.12:4011/average?numbers=1,2,3


Anforderungs-Checkliste

  • Eigene Modul-Datei (mathModule.js) erstellt
  • Über module.exports exportiert
  • Im Server über require() eingebunden
  • Server läuft mit nativem http.createServer()
  • URL-Parameter werden sauber ausgelesen und verarbeitet
  • Keine externen Libraries (wie Express) verwendet