mitmario.dev

Platzhalter im Pfad

Node.js Sandbox 3 Min Lesezeit 3 BeispieleLektion 3 von 7

In Lektion 8.5 hast du /buecher/12 von Hand zerlegt: split("/"), das filter gegen die leeren Stücke, eine Längenprüfung, und dann das richtige Element herausgreifen. Ungefähr zehn Zeilen für eine Route.

Ein Doppelpunkt

Ein Platzhalter statt zehn Zeilen
import express from "express";

const app = express();

// In 8.5 waren dafuer split, filter und eine Laengenpruefung noetig.
app.get("/buecher/:id", (req, res) => {
  res.send(`Buch ${req.params.id}`);
});

app.listen(3000);

Ein Pfadstück, das mit einem Doppelpunkt anfängt, ist ein Platzhalter. Was der Aufrufer an dieser Stelle geschickt hat, steht danach in req.params unter diesem Namen.

Das ist die Zeile, die die zehn ersetzt. Und weil sie so kurz ist, geht leicht unter, was sie noch alles mitbringt: die Längenprüfung ist eingebaut, die Kodierung ist aufgelöst, und die Route greift nur, wenn wirklich genau ein Stück dort steht.

Rechts steht /buecher/7. Tausch die Zahl in der Adresszeile gegen eine andere, und die Antwort geht mit. Tipp /buecher ohne Zahl, und es kommt die Fehlerseite von Express: Die Route verlangt das Stück, sie macht es nicht optional.

Mehrere Platzhalter, und alle sind Text

Mehrere Platzhalter, und kein Schrägstrich darin
import express from "express";

const app = express();

app.get("/buecher/:id/seiten/:nr", (req, res) => {
  const { id, nr } = req.params;
  res.json({ id, nr, typ: typeof id });
});

app.get("/dateien/:name", (req, res) => res.send(`Datei ${req.params.name}`));

app.listen(3000);

Zwei Dinge zeigt dieses Beispiel.

Der Typ ist string, auch bei 42. Das ist dieselbe Regel wie bei den Kommandozeilenargumenten aus 4.1 und den Query-Parametern aus 8.6, und es ist ihre vierte Wiederholung. Wenn du mit einer ID rechnen willst, musst du sie umwandeln, und wenn du sie prüfen willst, dann prüfen. /buecher/abc passt auf /buecher/:id genauso gut wie /buecher/42, denn ein Platzhalter fragt nicht nach der Form.

Beides kannst du über die Adresszeile nachstellen. Rechts steht der erste Fall, /dateien/logo.png zeigt den zweiten, und /dateien/bilder/logo.png zeigt den dritten.

Ein Platzhalter frisst keinen Schrägstrich. /dateien/:name passt auf /dateien/logo.png, aber nicht auf /dateien/bilder/logo.png. Das ist meistens genau richtig, denn sonst würde eine einzelne Route ungewollt halbe Adressbereiche verschlucken. Wenn du wirklich einen ganzen Rest-Pfad entgegennehmen willst, brauchst du dafür einen benannten Stern, /dateien/*rest, und req.params gibt ihn dir als Liste der Stücke.

Und jetzt die Reihenfolge

Aus 9.2 weißt du: von oben nach unten, die erste passende Route gewinnt. Zusammen mit Platzhaltern wird daraus eine Falle, in die jeder einmal tappt.

neu muss vor dem Platzhalter stehen
import express from "express";

const app = express();

// Falsch herum: der Platzhalter steht oben und nimmt auch "neu" an.
app.get("/falsch/buecher/:id", (req, res) => res.send(`Buch ${req.params.id}`));
app.get("/falsch/buecher/neu", (req, res) => res.send("Formular"));

// Richtig herum: der feste Pfad zuerst.
app.get("/richtig/buecher/neu", (req, res) => res.send("Formular"));
app.get("/richtig/buecher/:id", (req, res) => res.send(`Buch ${req.params.id}`));

app.listen(3000);

Beide Reihenfolgen stehen in derselben Datei, einmal unter /falsch und einmal unter /richtig. Rechts steht /falsch/buecher/neu, und dort kommt „Buch neu”. Tipp /richtig/buecher/neu, und dort kommt das Formular. Dieselben zwei Zeilen, nur vertauscht.

/buecher/neu soll ein Formular zeigen. /buecher/:id soll ein Buch zeigen. Aber neu ist ein gültiges Pfadstück, also passt es auf :id, und wenn die Platzhalter-Route oben steht, gewinnt sie. Der Server sucht dann brav nach einem Buch mit der ID neu.

Und das Tückische daran ist, dass nichts kaputtgeht. Kein Fehler, keine Warnung, keine Doppeldeutigkeit, über die sich jemand beschweren würde. Die Anwendung liefert einfach die falsche Antwort, und zwar eine, die für sich genommen plausibel aussieht.

Die Regel dazu ist einfach: Je spezifischer eine Route, desto weiter oben gehört sie. Feste Pfade vor Platzhaltern, lange Pfade vor kurzen, und der Standardfall ganz unten.

Wenn du dich fragst, ob Express das nicht selbst sortieren könnte: Es könnte, und andere Bibliotheken tun das auch. Express hat sich bewusst dagegen entschieden, weil eine Sortierregel, die man nicht sieht, schwerer zu durchschauen ist als eine Liste, die von oben nach unten abgearbeitet wird. Du bezahlst diese Klarheit mit der Pflicht, selbst auf die Reihenfolge zu achten.

Zum Mitnehmen

Ein Doppelpunkt macht aus einem Pfadstück einen Wert in req.params. Der ist Text, und er frisst keinen Schrägstrich.

Jetzt du

Basis Konto, kostenlos

Zu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.

Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.

In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.

Was in dieser Lektion steckt

  • Artikel mit 3 Beispielen zum Ausprobieren

    Steht hier, ohne Konto lesbar.

  • Aufgabe, dein Code läuft auf einem Server

    Öffnet sich mit dem Basis Konto.