Linux Professional Institute Learning Logo.
Weiter zum Inhalt
  • Home
    • Alle Ressourcen
    • LPI Lernmaterialien
    • Mitmachen
    • Publishing Partner
    • Publishing Partner werden
    • Über uns
    • FAQ
    • Mitwirkende
    • Übersetzungen
    • Kontakt
  • LPI.org
035.2 Lektion 1
Thema 031: Softwareentwicklung und Webtechnologien
031.1 Grundlagen der Softwareentwicklung
  • 031.1 Lektion 1
031.2 Architektur von Webanwendungen
  • 031.2 Lektion 1
031.3 HTTP Grundlagen
  • 031.3 Lektion 1
Thema 032: HTML-Dokument-Markup
032.1 Aufbau eines HTML-Dokuments
  • 032.1 Lektion 1
032.2 HTML-Semantik und Dokumenthierarchie
  • 032.2 Lektion 1
032.3 HTML-Referenzen und eingebettete Ressourcen
  • 032.3 Lektion 1
032.4 HTML-Formulare
  • 032.4 Lektion 1
Thema 033: Gestaltung von Inhalten mit CSS
033.1 CSS-Grundlagen
  • 033.1 Lektion 1
033.2 CSS-Selektoren und Stilanwendung
  • 033.2 Lektion 1
033.3 Gestaltung mit CSS
  • 033.3 Lektion 1
033.4 CSS-Box-Modell und -Layout
  • 033.4 Lektion 1
Thema 034: JavaScript-Programmierung
034.1 JavaScript-Ausführung und -Syntax
  • 034.1 Lektion 1
034.2 JavaScript Datenstrukturen
  • 034.2 Lektion 1
034.3 JavaScript-Kontrollstrukturen und -Funktionen
  • 034.3 Lektion 1
  • 034.3 Lektion 2
034.4 JavaScript-Manipulation von Website-Inhalt und -Gestaltung
  • 034.4 Lektion 1
Thema 035: Node.js Server-Programmierung
035.1 Node.js Grundlagen
  • 035.1 Lektion 1
035.2 Node.js Express Grundlagen
  • 035.2 Lektion 1
  • 035.2 Lektion 2
035.3 SQL Grundlagen
  • 035.3 Lektion 1
How to get certified
  1. Thema 035: Node.js Server-Programmierung
  2. 035.2 Node.js Express Grundlagen
  3. 035.2 Lektion 1

035.2 Lektion 1

Zertifikat:

Web Development Essentials

Version:

1.0

Thema:

035 Node.js Server-Programmierung

Lernziel:

035.2 Node.js Express Grundlagen

Lektion:

1 von 2

Einführung

Express.js, oder einfach Express, ist ein beliebtes Framework, das auf Node.js läuft und dem Schreiben von HTTP-Servern dient, die Anfragen von Clients der Webanwendung bearbeiten. Express unterstützt viele Arten zum Lesen von über HTTP gesendeten Parametern.

Erstes Server-Skript

Um die grundlegenden Funktionen von Express für den Empfang und die Bearbeitung von Anfragen zu demonstrieren, simulieren wir eine Anwendung, die einige Informationen vom Server anfordert. Genauer gesagt, der Beispielserver

  • bietet eine echo-Funktion, die lediglich die vom Client gesendete Nachricht zurückgibt.

  • teilt dem Client auf Anfrage seine IP-Adresse mit.

  • verwendet Cookies, um bekannte Clients zu identifizieren.

Der erste Schritt besteht darin, die JavaScript-Datei zu erstellen, die als Server fungieren wird. Erstellen Sie mit npm ein Verzeichnis namens myserver mit der JavaScript-Datei:

$ mkdir myserver
$ cd myserver/
$ npm init

Als Einstiegspunkt können Sie einen beliebigen Dateinamen wählen. Hier nutzen wir den Standarddateinamen index.js. Die folgende Auflistung zeigt eine einfache index.js-Datei, die als Einstiegspunkt für unseren Server dient:

const express = require('express')
const app = express()
const host = "myserver"
const port = 8080

app.get('/', (req, res) => {
  res.send('Request received')
})

app.listen(port, host, () => {
  console.log(`Server ready at http://${host}:${port}`)
})

Einige wichtige Konstanten für die Serverkonfiguration sind in den ersten Zeilen des Skripts definiert. Die ersten beiden, express und app, entsprechen dem eingeschlossenen Modul express und einer Instanz dieses Moduls, die unsere Anwendung ausführt. Wir fügen die vom Server auszuführenden Aktionen zum Objekt app hinzu.

Die beiden anderen Konstanten, host und port, definieren den Host und den Kommunikationsport des Servers.

Wenn Sie einen öffentlich zugänglichen Host haben, verwenden Sie dessen Namen anstelle von myserver als Wert für host. Wenn Sie den Hostnamen nicht angeben, verwendet Express standardmäßig localhost, den Computer, auf dem die Anwendung läuft. In diesem Fall können keine externen Clients das Programm erreichen, was für Testzwecke in Ordnung sein mag, aber in der Produktion wenig Nutzen bringt.

Der Port muss angegeben werden, andernfalls kann der Server nicht gestartet werden.

Dieses Skript fügt nur zwei Prozeduren an das app-Objekt an: die Aktion app.get(), die Anfragen von Clients über HTTP GET beantwortet, und den Aufruf app.listen(), der erforderlich ist, um den Server zu aktivieren und ihm einen Host und einen Port zuzuweisen.

Um den Server zu starten, führen Sie einfach den Befehl node aus und geben den Skriptnamen als Argument an:

$ node index.js

Sobald die Meldung Server ready at http://myserver:8080 erscheint, ist der Server bereit, Anfragen von einem HTTP-Client zu empfangen. Die Anfragen können von einem Browser auf demselben Computer gestellt werden, auf dem der Server läuft, oder von einem anderen Rechner, der Zugriff auf den Server hat.

Alle Transaktionsdetails, die wir im Folgenden sehen, werden im Browser angezeigt, wenn Sie ein Fenster für die Entwicklerkonsole öffnen. Alternativ nutzen Sie den Befehl curl für die HTTP-Kommunikation, mit dem Sie die Verbindungsdetails einfacher überprüfen. Wenn Sie mit der Shell-Befehlszeile nicht vertraut sind, können Sie ein HTML-Formular erstellen, um Anfragen an einen Server zu senden.

Das folgende Beispiel zeigt, wie Sie den Befehl curl in der Befehlszeile nutzen, um eine HTTP-Anfrage an den neu eingerichteten Server zu stellen:

$ curl http://myserver:8080 -v
* Trying 192.168.1.225:8080...
* TCP_NODELAY set
* Connected to myserver (192.168.1.225) port 8080 (#0)
> GET / HTTP/1.1
> Host: myserver:8080
> User-Agent: curl/7.68.0
>Accept: /
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/html; charset=utf-8
< Content-Length: 16
< ETag: W/"10-1WVvDtVyAF0vX9evlsFlfiJTT5c"
< Date: Fri, 02 Jul 2021 14:35:11 GMT
< Connection: keep-alive
<
* Connection #0 to host myserver left intact
Request received

Die Option -v des Befehls curl zeigt alle Anfrage- und Antwort-Header sowie andere Debugging-Informationen. Die Zeilen, die mit > beginnen, zeigen die vom Client gesendeten Anfrage-Header, und die Zeilen, die mit < beginnen, zeigen die vom Server gesendeten Antwort-Header. Zeilen, die mit * beginnen, sind Informationen, die curl selbst erzeugt. Der Inhalt der Antwort wird erst am Ende angezeigt — in diesem Fall die Zeile Request received.

Die URL des Dienstes, die in diesem Fall den Hostnamen und den Port des Servers (http://myserver:8080) enthält, wurde curl als Argument übergeben. Da kein Verzeichnis oder Dateiname angegeben wurde, werden diese standardmäßig auf das Stammverzeichnis / gesetzt. Der Schrägstrich taucht als Anfragedatei in der Zeile > GET / HTTP/1.1 auf, auf die in der Ausgabe der Hostname und der Port folgen.

Neben der Anzeige von HTTP-Verbindungsheadern unterstützt der Befehl curl die Anwendungsentwicklung, indem Sie Daten mit verschiedenen HTTP-Methoden und in unterschiedlichen Formaten an den Server senden können. Diese Flexibilität macht es einfacher, Probleme zu beheben und neue Funktionen auf dem Server zu implementieren.

Routen

Welche Anfragen der Client an den Server stellen kann, hängt davon ab, welche Routen in der Datei index.js definiert wurden. Eine Route spezifiziert eine HTTP-Methode und einen Pfad (genauer gesagt: einen URI), den der Client anfordern kann.

Bislang haben wir auf dem Server nur eine Route konfiguriert:

app.get('/', (req, res) => {
  res.send('Request received')
})

Obwohl es sich um eine sehr einfache Route handelt, die lediglich eine Textnachricht an den Client zurücksendet, reicht sie aus, um die wichtigsten Komponenten zu identifizieren, die zur Strukturierung der meisten Routen verwendet werden:

  • Die HTTP-Methode, die von der Route bedient wird. In diesem Beispiel ist die HTTP-Methode GET durch die Eigenschaft get des Objekts app angegeben.

  • Der Pfad, der von der Route bedient wird. Wenn der Client keinen Pfad für die Anfrage angibt, verwendet der Server das Root-Verzeichnis, also das Basisverzeichnis, das für den Webserver reserviert ist. Ein späteres Beispiel in dieser Lektion verwendet den Pfad /echo, der einer Anfrage an myserver:8080/echo entspricht.

  • Die Funktion, die ausgeführt wird, wenn der Server eine Anfrage auf dieser Route erhält. Sie wird gewöhnlich in abgekürzter Form als Pfeilfunktion geschrieben, da die Syntax ⇒ auf die Definition der namenlosen Funktion verweist. Die Parameter req (kurz für “request”) und res (kurz für “response”) geben Details über die Verbindung an, die von der App-Instanz selbst an die Funktion übergeben werden.

POST-Methode

Um die Funktionalität unseres Test-Servers zu erweitern, sehen wir uns an, wie man eine Route für die HTTP-Methode POST definiert. Sie wird von Clients verwendet, um zusätzliche Daten an den Server zu senden, die über die im Request-Header enthaltenen Angaben hinausgehen. Die Option --data des curl-Befehls ruft automatisch die POST-Methode auf und enthält Informationen, die über POST an den Server gesendet werden. Die Zeile POST / HTTP/1.1 in der folgenden Ausgabe zeigt, dass die Methode POST verwendet wurde. Unser Server hat jedoch nur eine GET-Methode definiert, so dass ein Fehler auftritt, wenn wir curl verwenden, um eine Anfrage über POST zu senden:

$ curl http://myserver:8080/echo --data message="This is the POST request body"
* Trying 192.168.1.225:8080...
* TCP_NODELAY set
* Connected to myserver (192.168.1.225) port 8080 (#0)
> POST / HTTP/1.1
> Host: myserver:8080
> User-Agent: curl/7.68.0
>Accept: /
> Content-Length: 37
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 37 out of 37 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< X-Powered-By: Express
< Content-Security-Policy: default-src 'none'
< X-Content-Type-Options: nosniff
< Content-Type: text/html; charset=utf-8
< Content-Length: 140
< Date: Sat, 03 Jul 2021 02:22:45 GMT
< Connection: keep-alive
<
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Error</title>
</head>
<body>
<pre>Cannot POST /</pre>
</body>
</html>
* Connection #0 to host myserver left intact

Im vorangegangenen Beispiel entspricht die Ausführung von curl mit dem Parameter --data message="This is the POST request body" dem Absenden eines Formulars, das ein Textfeld namens message enthält, das mit This is the POST request body gefüllt ist.

Da der Server mit nur einer Route für den /-Pfad konfiguriert ist und diese Route nur auf die HTTP-Methode GET antwortet, enthält der Antwort-Header die Zeile HTTP/1.1 404 Not Found. Außerdem generiert Express automatisch eine kurze HTML-Antwort mit der Warnung Cannot POST.

Nachdem wir gesehen haben, wie curl eine POST-Anfrage erzeugt, schreiben wir nun ein Express-Programm, das die Anfrage erfolgreich bearbeitet.

Beachten Sie zunächst, dass das Feld Content-Type im Request-Header besagt, dass die vom Client gesendeten Daten im Format application/x-www-form-urlencoded vorliegen. Express erkennt dieses Format standardmäßig nicht, also nutzen wir das Modul express.urlencoded. Wenn wir dieses Modul einbinden, hat das req-Objekt — das als Parameter an die Handler-Funktion übergeben wird — die Eigenschaft req.body.message, die dem vom Client gesendeten Feld message entspricht. Das Modul wird mit app.use geladen, das vor der Deklaration von Routen platziert werden sollte:

const express = require('express')
const app = express()
const host = "myserver"
const port = 8080

app.use(express.urlencoded({ extended: true }))

Sobald dies geschehen ist, würde es genügen, in der bestehenden Route app.get in app.post zu ändern, um Anfragen, die über POST gestellt werden, zu erfüllen und den Request-Body wiederherzustellen:

app.post('/', (req, res) => {
  res.send(req.body.message)
})

Statt die Route zu ersetzen, könnte man auch einfach diese neue Route hinzufügen, denn Express erkennt die HTTP-Methode im Request-Header und nutzt die entsprechende Route. Da wir diesem Server mehr als eine Funktionalität hinzuzufügen wollen, bietet es sich an, jede mit ihrem eigenen Pfad zu trennen, z.B. /echo und /ip.

Pfad und Funktionshandler

Nachdem wir festgelegt haben, welche HTTP-Methode auf die Anfrage antwortet, müssen wir nun einen spezifischen Pfad für die Ressource und eine Funktion definieren, die eine Antwort an den Client verarbeitet und erzeugt.

Um die echo-Funktionalität des Servers zu erweitern, definieren wir mit der Methode POST eine Route mit dem Pfad /echo:

app.post('/echo', (req, res) => {
  res.send(req.body.message)
})

Der Parameter req der Handler-Funktion enthält alle Details der Anfrage, die als Eigenschaften gespeichert sind. Der Inhalt des Feldes message im Request Body ist in der Eigenschaft req.body.message verfügbar. Im Beispiel wird dieses Feld einfach durch den Aufruf res.send(req.body.message) an den Client zurückgesendet.

Denken Sie daran, dass die von Ihnen vorgenommenen Änderungen erst nach einem Neustart des Servers wirksam werden. Da Sie den Server während der Beispiele in diesem Kapitel in einem Terminalfenster ausführen, können Sie den Server durch Drücken von kbd:[Strg+C] in diesem Terminal herunterfahren. Starten Sie dann den Server erneut mit dem Befehl node index.js. Die Antwort, die der Client auf die zuvor gezeigte curl-Anfrage erhält, ist nun erfolgreich:

$ curl http://myserver:8080/echo --data message="This is the POST request body"
This is the POST request body

Andere Möglichkeiten der Übergabe und Rückgabe von Informationen in einer GET-Anfrage

Die HTTP-Methode`POST` könnte übertrieben sein, wenn nur kurze Textnachrichten wie die im Beispiel gesendet werden sollen. In solchen Fällen können die Daten in einem Query String gesendet werden, der mit einem Fragezeichen beginnt. So könnte die Zeichenkette ?message=This+is+the+message in den Abfragepfad der HTTP-Methode GET aufgenommen werden. Die im Abfrage-String verwendeten Felder stehen dem Server in der Eigenschaft req.query zur Verfügung. Daher ist ein Feld mit dem Namen message in der Eigenschaft req.query.message verfügbar.

Eine weitere Möglichkeit, Daten über die HTTP-Methode GET zu senden, sind die Routing-Parameter von Express:

app.get('/echo/:message', (req, res) => {
  res.send(req.params.message)
})

Die Route in diesem Beispiel passt zu Anfragen, die mit der Methode GET unter Verwendung des Pfades /echo/:message gestellt werden, wobei :message ein Platzhalter für jeden Begriff ist, der mit diesem Label vom Client gesendet wird. Diese Parameter sind über die Eigenschaft req.params zugänglich. Mit dieser neuen Route kann die Funktion echo des Servers vom Client knapper abgefragt werden:

$ curl http://myserver:8080/echo/hello
hello

In anderen Situationen müssen die Informationen, die der Server zur Bearbeitung der Anfrage benötigt, nicht explizit vom Client bereitgestellt werden, zum Beispiel die öffentliche IP-Adresse des Clients. Diese Information ist standardmäßig im Objekt req in der Eigenschaft req.ip enthalten:

app.get('/ip', (req, res) => {
  res.send(req.ip)
})

Jetzt kann der Client den Pfad /ip mit der Methode GET anfordern, um seine eigene öffentliche IP-Adresse zu ermitteln:

$ curl http://myserver:8080/ip
187.34.178.12

Andere Eigenschaften des req-Objekts kann der Client ändern, insbesondere die in req.headers verfügbaren Anfrage-Header. Die Eigenschaft req.headers.user-agent zum Beispiel identifiziert das Programm, das die Anfrage stellt. Obwohl es nicht üblich ist, kann der Client den Inhalt dieses Feldes ändern, so dass der Server es nicht verwenden sollte, um einen bestimmten Client zuverlässig zu identifizieren. Noch wichtiger ist es, die explizit vom Client bereitgestellten Daten zu validieren, um Inkonsistenzen bei Grenzen und Formaten zu vermeiden, die sich nachteilig auf die Anwendung auswirken könnten.

Anpassungen an die Antwort

Wie in früheren Beispielen gesehen, ist der Parameter res für die Rückgabe einer Antwort an den Client verantwortlich. Außerdem kann das res-Objekt andere Teile der Antwort ändern. Sie haben vielleicht bemerkt, dass, obwohl die bislang implementierten Antworten nur kurze Textnachrichten sind, der Content-Type-Header der Antworten text/html; charset=utf-8 verwendet. Obwohl dies nicht verhindert, dass die Klartext-Antwort akzeptiert wird, wäre es korrekter, das Feld im Antwort-Header mit der Einstellung res.type('text/plain') auf text/plain zu setzen.

Andere Anpassungen der Antwort nutzen Cookies, die es dem Server ermöglichen, einen Client zu identifizieren, der zuvor eine Anfrage gestellt hat. Cookies sind wichtig für fortgeschrittene Funktionen, wie z.B. die Erstellung privater Sitzungen, die Anfragen einem bestimmten Benutzer zuordnen. Hier betrachten wir jedoch nur ein einfaches Beispiel für den Einsatz von Cookies, um einen Client zu identifizieren, der zuvor auf den Server zugegriffen hat.

Aufgrund des modularen Aufbaus von Express muss die Cookie-Verwaltung mit dem Befehl npm installiert werden, bevor sie im Skript nutzbar ist:

$ npm install cookie-parser

Nach der Installation muss die Cookie-Verwaltung in das Serverskript aufgenommen werden. Fügen Sie dazu die folgende Definition am Anfang der Datei ein:

const cookieParser = require('cookie-parser')
app.use(cookieParser())

Um die Verwendung von Cookies zu veranschaulichen, ändern wir die Handler-Funktion der Route mit dem Wurzelpfad /, die bereits im Skript vorhanden ist. Das Objekt req hat eine Eigenschaft req.cookies, in der die im Request-Header gesendeten Cookies gespeichert werden. Das res-Objekt hingegen verfügt über eine Methode res.cookie(), die ein neues Cookie erstellt, das an den Client gesendet wird. Die Handler-Funktion im folgenden Beispiel prüft, ob ein Cookie mit dem Namen known in der Anfrage existiert. Falls nicht, geht der Server davon aus, dass es sich um einen Erstbesucher handelt, und sendet ihm über den Aufruf res.cookie('known', '1') ein Cookie dieses Namens. Wir weisen dem Cookie willkürlich den Wert 1 zu, weil es irgendeinen Inhalt haben soll, aber der Server fragt diesen Wert nicht ab. Diese Anwendung geht einfach davon aus, dass das Vorhandensein des Cookies darauf hinweist, dass der Client diese Route bereits zuvor angefordert hat:

app.get('/', (req, res) => {
  res.type('text/plain')
  if ( req.cookies.known === undefined ){
    res.cookie('known', '1')
    res.send('Welcome, new visitor!')
  }
  else
    res.send('Welcome back, visitor');
})

Standardmäßig verwendet curl keine Cookies in Transaktionen. Es gibt jedoch Optionen zum Speichern (-c cookies.txt) und Senden gespeicherter Cookies (-b cookies.txt):

$ curl http://myserver:8080/ -c cookies.txt -b cookies.txt -v
* Trying 192.168.1.225:8080...
* TCP_NODELAY set
* Connected to myserver (192.168.1.225) port 8080 (#0)
> GET / HTTP/1.1
> Host: myserver:8080
> User-Agent: curl/7.68.0
>Accept: /
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/plain; charset=utf-8
* Added cookie known="1" for domain myserver, path /, expire 0
< Set-Cookie: known=1; Path=/
< Content-Length: 21
< ETag: W/"15-l7qrxcqicl4xv6EfA5fZFWCFrgY"
< Date: Sat, 03 Jul 2021 23:45:03 GMT
< Connection: keep-alive
<
* Connection #0 to host myserver left intact
Welcome, new visitor!

Da dieser Befehl der erste Zugriff seit der Implementierung von Cookies auf dem Server war, verfügte der Client über keine Cookies, die er in die Anfrage aufnehmen konnte. Wie erwartet hat der Server das Cookie in der Anfrage nicht identifiziert und daher das Cookie in die Antwort-Header aufgenommen, wie in der Zeile Set-Cookie: known=1; Path=/ in der Ausgabe zu sehen. Da wir Cookies in curl aktiviert haben, wird eine neue Anfrage das Cookie known=1 in den Header der Anfrage aufnehmen, so dass der Server das Vorhandensein des Cookies erkennen kann:

$ curl http://myserver:8080/ -c cookies.txt -b cookies.txt -v
* Trying 192.168.1.225:8080...
* TCP_NODELAY set
* Connected to myserver (192.168.1.225) port 8080 (#0)
> GET / HTTP/1.1
> Host: myserver:8080
> User-Agent: curl/7.68.0
>Accept: /
> Cookie: known=1
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/plain; charset=utf-8
< Content-Length: 21
< ETag: W/"15-ATq2flQYtLMYIUpJwwpb5SjV9Ww"
< Date: Sat, 03 Jul 2021 23:45:47 GMT
< Connection: keep-alive
<
* Connection #0 to host myserver left intact
Welcome back, visitor

Cookie-Sicherheit

Sie sollten sich potenzieller Schwachstellen bewusst sein, wenn Sie Cookies zur Identifizierung von Clients nutzen, die Anfragen stellen. Angreifer können Techniken wie Cross-Site Scripting (XSS) und Cross-Site Request Forgery (CSRF) einsetzen, um Cookies von einem Client zu stehlen und sich damit bei einer Anfrage an den Server als dieser auszugeben. Im Allgemeinen verwenden diese Arten von Angriffen nicht überprüfte Kommentarfelder oder sorgfältig konstruierte URLs, um schädlichen JavaScript-Code in die Seite einzufügen. Wenn dieser Code von einem authentischen Client ausgeführt wird, kann er gültige Cookies kopieren und sie speichern oder an ein anderes Ziel weiterleiten.

Daher ist es vor allem bei professionellen Anwendungen wichtig, speziellere Express-Funktionen zu installieren und zu verwenden, die als Middleware bezeichnet werden. Die Module express-session oder cookie-session bieten eine umfassendere und sicherere Kontrolle über die Verwaltung von Sitzungen und Cookies. Diese Komponenten ermöglichen zusätzliche Kontrollen, um zu verhindern, dass Cookies von ihrem ursprünglichen Aussteller umgeleitet werden.

Geführte Übungen

  1. Wie kann der Inhalt des Feldes comment, der in einem Query-String der HTTP-Methode GET gesendet wird, in einer Handler-Funktion gelesen werden?

  2. Schreiben Sie eine Route, die die HTTP-Methode GET und den Pfad /agent verwendet, um den Inhalt der Kopfzeile user-agent an den Client zurückzusenden.

  3. Express.js hat ein Feature namens Routing-Parameter, bei dem ein Pfad wie /user/:name genutzt werden kann, um den vom Client gesendeten Parameter name zu empfangen. Wie kann auf den Parameter name innerhalb der Handler-Funktion der Route zugegriffen werden?

Offene Übungen

  1. Wenn der Hostname eines Servers myserver lautet, welche Express-Route würde die Übermittlung in der folgenden Form empfangen?

    <form action="/contact/feedback" method="post"> ... </form>
  2. Während der Serverentwicklung ist es Ihnen nicht möglich, die Eigenschaft req.body zu lesen, obwohl Sie überprüft haben, dass der Client den Inhalt korrekt über die HTTP-Methode POST sendet. Was ist eine mögliche Ursache für dieses Problem?

  3. Was passiert, wenn der Server eine Route auf den Pfad /user/:name gesetzt hat und der Client eine Anfrage an /user/ stellt?

Zusammenfassung

Diese Lektion erklärt, wie man Express-Skripte schreibt, um HTTP-Anfragen zu empfangen und zu bearbeiten. Express verwendet das Konzept der Routen, um die Ressourcen zu definieren, die den Clients zur Verfügung stehen, was Ihnen große Flexibilität beim Aufbau von Servern für jede Art von Webanwendung bietet. In dieser Lektion werden die folgenden Konzepte und Verfahren behandelt:

  • Routen, die die HTTP-Methoden GET und POST verwenden.

  • Wie Formulardaten im request-Objekt gespeichert werden.

  • Wie man Routen-Parameter verwendet.

  • Anpassen der Antwort-Header.

  • Grundlegende Cookie-Verwaltung.

Lösungen zu den geführten Übungen

  1. Wie kann der Inhalt des Feldes comment, der in einem Query-String der HTTP-Methode GET gesendet wird, in einer Handler-Funktion gelesen werden?

    Das Feld comment ist in der Eigenschaft req.query.comment verfügbar.

  2. Schreiben Sie eine Route, die die HTTP-Methode GET und den Pfad /agent verwendet, um den Inhalt der Kopfzeile user-agent an den Client zurückzusenden.

    app.get('/agent', (req, res) => {
      res.send(req.headers.user-agent)
    })
  3. Express.js hat ein Feature namens Routing-Parameter, bei dem ein Pfad wie /user/:name genutzt werden kann, um den vom Client gesendeten Parameter name zu empfangen. Wie kann auf den Parameter name innerhalb der Handler-Funktion der Route zugegriffen werden?

    Der Parameter name ist über die Eigenschaft req.params.name zugänglich.

Lösungen zu den offenen Übungen

  1. Wenn der Hostname eines Servers myserver lautet, welche Express-Route würde die Übermittlung in der folgenden Form empfangen?

    <form action="/contact/feedback" method="post"> ... </form>
    app.post('/contact/feedback', (req, res) => {
      ...
    })
  2. Während der Serverentwicklung ist es Ihnen nicht möglich, die Eigenschaft req.body zu lesen, obwohl Sie überprüft haben, dass der Client den Inhalt korrekt über die HTTP-Methode POST sendet. Was ist eine mögliche Ursache für dieses Problem?

    Das Modul express.urlencoded, mit dem Express den Body einer Anfrage extrahieren kann, wurde nicht eingebunden.

  3. Was passiert, wenn der Server eine Route auf den Pfad /user/:name gesetzt hat und der Client eine Anfrage an /user/ stellt?

    Der Server gibt eine Antwort 404 Not Found aus, da die Route die Angabe des Parameters :name durch den Client erfordert.

Linux Professional Insitute Inc. Alle Rechte vorbehalten. Besuchen Sie die LPI Learning Website: https://learning.lpi.org
Dieses Werk steht unter der Lizenz Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

Nächste Lektion

035.2 Node.js Express Grundlagen (035.2 Lektion 2)

Nächste Lektion lesen

Linux Professional Insitute Inc. Alle Rechte vorbehalten. Besuchen Sie die LPI Learning Website: https://learning.lpi.org
Dieses Werk steht unter der Lizenz Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International.

LPI ist eine Non-Profit-Organisation.

© 2025 Linux Professional Institute (LPI) ist eine globale Organisation für Zertifizierungsstandards und zur Karriereplanung für Open-Source-Profis. Mit mehr als 250.000 Zertifikatsinhabern ist es die weltweit erste und größte herstellerneutrale Linux- und Open-Source-Zertifizierungsstelle. LPI verfügt über zertifizierte Fachleute in über 180 Ländern, bietet Prüfungen in mehreren Sprachen an und hat Hunderte von Trainingspartnern.

Unser Ziel ist es, wirtschaftliche und kreative Möglichkeiten für alle zu ermöglichen, indem wir Open-Source-Wissens- und Kompetenzzertifizierungen allgemein zugänglich machen.

  • LinkedIn
  • flogo-RGB-HEX-Blk-58 Facebook
  • Twitter
  • Kontaktieren Sie uns
  • Datenschutz und Cookie-Richtlinien

Haben Sie einen Fehler entdeckt oder möchten Sie helfen, diese Seite zu verbessern? Lassen Sie es uns wissen.

© 1999–2025 The Linux Professional Institute Inc. Alle Rechte vorbehalten.