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 Eigenschaftget
des Objektsapp
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 anmyserver: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 Parameterreq
(kurz für “request”) undres
(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
-
Wie kann der Inhalt des Feldes
comment
, der in einem Query-String der HTTP-MethodeGET
gesendet wird, in einer Handler-Funktion gelesen werden? -
Schreiben Sie eine Route, die die HTTP-Methode
GET
und den Pfad/agent
verwendet, um den Inhalt der Kopfzeileuser-agent
an den Client zurückzusenden. -
Express.js hat ein Feature namens Routing-Parameter, bei dem ein Pfad wie
/user/:name
genutzt werden kann, um den vom Client gesendeten Parametername
zu empfangen. Wie kann auf den Parametername
innerhalb der Handler-Funktion der Route zugegriffen werden?
Offene Übungen
-
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>
-
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-MethodePOST
sendet. Was ist eine mögliche Ursache für dieses Problem? -
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
undPOST
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
-
Wie kann der Inhalt des Feldes
comment
, der in einem Query-String der HTTP-MethodeGET
gesendet wird, in einer Handler-Funktion gelesen werden?Das Feld
comment
ist in der Eigenschaftreq.query.comment
verfügbar. -
Schreiben Sie eine Route, die die HTTP-Methode
GET
und den Pfad/agent
verwendet, um den Inhalt der Kopfzeileuser-agent
an den Client zurückzusenden.app.get('/agent', (req, res) => { res.send(req.headers.user-agent) })
-
Express.js hat ein Feature namens Routing-Parameter, bei dem ein Pfad wie
/user/:name
genutzt werden kann, um den vom Client gesendeten Parametername
zu empfangen. Wie kann auf den Parametername
innerhalb der Handler-Funktion der Route zugegriffen werden?Der Parameter
name
ist über die Eigenschaftreq.params.name
zugänglich.
Lösungen zu den offenen Übungen
-
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) => { ... })
-
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-MethodePOST
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. -
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.