Anfängerhandbuch zur Webserverentwicklung mit Node.js.

Während des größten Teils meiner Webkarriere habe ich ausschließlich auf Kundenseite gearbeitet. Entwerfen adaptiver Layouts, Erstellen von Visualisierungen aus großen Datenmengen, Erstellen von Anwendungs-Dashboards usw. Aber ich musste mich nie direkt mit Routing- oder HTTP-Anforderungen befassen. Bis vor kurzem.

Dieser Beitrag beschreibt, wie ich mehr über die serverseitige Webentwicklung mit Node.js erfahren habe, und einen kurzen Vergleich des Schreibens eines einfachen HTTP-Servers mit drei verschiedenen Umgebungen, Express, Koa.js und Hapi.js.

Hinweis: Wenn Sie ein erfahrener Node.js-Entwickler sind, werden Sie wahrscheinlich denken, dass dies alles elementar / einfach ist. ¯ \ _ (ツ) _ / ¯.

Einige Grundlagen des Netzwerks


Als ich vor ein paar Jahren anfing, in der Webbranche zu arbeiten, stieß ich auf einen Kurs über Computernetzwerke von Professor David Veteral auf Coursera. Leider ist es nicht mehr verfügbar, aber Vorträge sind weiterhin auf der Pearson-Website verfügbar.

Dieser Kurs hat mir sehr gut gefallen, weil er auf verständliche Weise erklärt hat, was unter der Haube passiert. Wenn Sie also das Lehrbuch für Computernetzwerke lesen können, lesen Sie alle Details zu den Wundern des Netzwerks.

Bild

Hier werde ich jedoch nur kurz auf den Kontext eingehen. HTTP (Hypertext Transfer Protocol) ist ein Kommunikationsprotokoll, das in Computernetzwerken verwendet wird. Es gibt viele im Internet, wie z. B. SMTP (Simple Mail Transfer Protocol) , FTP (File Transfer Protocol) , POP3 (Post Office Protocol 3) und so weiter.

Diese Protokolle ermöglichen Geräten mit völlig unterschiedlicher Hardware / Software die Kommunikation miteinander, da sie genau definierte Nachrichtenformate, Regeln, Syntax und Semantik usw. bereitstellen. Dies bedeutet, dass das Gerät zwar ein bestimmtes Protokoll unterstützt, jedoch mit jedem anderen Gerät kommunizieren kann. im Netz.

Bild
Von TCP / IP vs OSI: Was ist der Unterschied zwischen den beiden Modellen?

Betriebssysteme werden normalerweise standardmäßig mit Netzwerkprotokollen wie HTTP unterstützt. Dies erklärt, warum wir keine explizite zusätzliche Software installieren müssen, um auf das Internet zugreifen zu können. Die meisten Netzwerkprotokolle unterstützen eine offene Verbindung zwischen zwei Geräten, sodass sie Daten hin und her übertragen können.

Das HTTP, auf dem das Netzwerk ausgeführt wird, ist unterschiedlich. Es ist als verbindungsloses Protokoll bekannt, da es auf einem Anforderungs- / Antwortmodus basiert. Webbrowser senden Anforderungen für Bilder, Schriftarten, Inhalte usw. an den Server. Nach Abschluss der Anforderung wird jedoch die Verbindung zwischen dem Browser und dem Server getrennt.

Bild

Server und Clients


Der Begriff Server kann für Personen, die zum ersten Mal in der Branche neu sind, etwas verwirrend sein, da er sich sowohl auf Hardware (physische Computer, auf denen alle für Websites erforderlichen Dateien und Software gehostet werden) als auch auf Software (ein Programm, das dies tut) beziehen kann ermöglicht Benutzern den Online-Zugriff auf diese Dateien).

Heute werden wir über die Software-Seite der Dinge sprechen. Aber zuerst ein paar Definitionen. Die URL steht für Universal Resource Locator und besteht aus drei Teilen: Protokoll , Server und der angeforderten Datei .

Bild
URL-Struktur

Das HTTP-Protokoll definiert verschiedene Methoden, mit denen der Browser den Server auffordern kann, eine Reihe verschiedener Aktionen auszuführen, von denen die häufigsten GET und POST sind. Wenn ein Benutzer auf einen Link klickt oder eine URL in die Adressleiste eingibt, sendet der Browser eine GET-Anforderung an den Server, um die in der URL angegebene Ressource abzurufen.

Der Server muss wissen, wie diese HTTP-Anforderung verarbeitet wird, um die richtige Datei zu erhalten, und sie dann an den Browser zurücksenden, der sie angefordert hat. Die beliebteste Webserver-Software, die dies handhabt, ist Apache und NGINX .

Bild
Webserver verarbeiten eingehende Anfragen und reagieren entsprechend

Bei beiden handelt es sich um Open-Source-Softwarepakete mit vollem Funktionsumfang, die Funktionen wie Authentifizierungsschemata, Umschreiben von URLs, Protokollierung und Proxy enthalten, um nur einige zu nennen. Apache und NGINX sind in C geschrieben. Technisch gesehen können Sie einen Webserver in jeder Sprache schreiben. Python , golang.org/pkg/net/http , Ruby , diese Liste kann einige Zeit dauern . Es ist nur so, dass einige Sprachen bestimmte Dinge besser können als andere.

Erstellen eines HTTP-Servers mit Node.js.


Node.js ist eine Javascript-Laufzeit, die auf der Chrome V8-Javascript-Engine basiert. Es wird mit dem http-Modul geliefert , das eine Reihe von Funktionen und Klassen zum Erstellen eines HTTP-Servers bereitstellt.

Für diesen grundlegenden HTTP-Server verwenden wir auch das Dateisystem , den Pfad und die URL , die native Module von Node.j sind.

Importieren Sie zunächst die erforderlichen Module.

const http = require('http') //   HTTP-  Node.js const fs = require('fs') //      const path = require('path') //        const url = require('url') //     URL 

Wir werden auch ein MIME-Typwörterbuch erstellen, damit wir der angeforderten Ressource basierend auf ihrer Erweiterung den entsprechenden MIME-Typ zuweisen können. Eine vollständige Liste der MIME-Typen finden Sie in der Internet Assigned Numbers Authority .

 const mimeTypes = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css', '.ico': 'image/x-icon', '.png': 'image/png', '.jpg': 'image/jpeg', '.gif': 'image/gif', '.svg': 'image/svg+xml', '.json': 'application/json', '.woff': 'font/woff', '.woff2': 'font/woff2' } 

Jetzt können wir einen HTTP-Server mit der Funktion http.createServer() erstellen, der eine neue Instanz von http.Server .

 const server = http.createServer() 

Wir werden die Request-Handler-Funktion mit den createServer() und Response-Objekten an createServer() . Diese Funktion wird jedes Mal einmal aufgerufen, wenn eine HTTP-Anforderung beim Server eintrifft.

 server.on('request', (req, res) => { //     }) 

Der Server wird gestartet, indem die listen Methode des server mit der Portnummer aufgerufen wird, die der Server abhören soll, z. B. 5000 .

 server.listen(5000) 

Das request ist eine Instanz von IncomingMessage und ermöglicht den Zugriff auf alle Informationen zur Anforderung, z. B. Antwortstatus, Header und Daten.

Das response ist eine Instanz von ServerResponse , einem beschreibbaren Stream, der viele Methoden zum Zurücksenden von Daten an den Client bietet.

Im Abfrage-Handler möchten wir Folgendes tun:

  • Analysieren Sie eingehende Anfragen und verarbeiten Sie sie ohne Erweiterungen

     const parsedUrl = new URL(req.url, 'https://node-http.glitch.me/') let pathName = parsedUrl.pathname let ext = path.extname(pathName) //   URL    '/',   '/' //      URL    'Location' if (pathName !== '/' && pathName[pathName.length - 1] === '/') { res.writeHead(302, {'Location': pathName.slice(0, -1)}) res.end() return } //     ,  index.html //     «.html»       if (pathName === '/') { ext = '.html' pathName = '/index.html' } else if (!ext) { ext = '.html' pathName += ext } 

  • Führen Sie einige elementare Überprüfungen durch, um festzustellen, ob die angeforderte Ressource vorhanden ist, und reagieren Sie entsprechend

     //     ,       const filePath = path.join(process.cwd(), '/public', pathName) // ,       fs.exists(filePath, function (exists, err) { //     ,  404 Not Found if (!exists || !mimeTypes[ext]) { console.log('  : ' + pathName) res.writeHead(404, {'Content-Type': 'text/plain'}) res.write('404 Not Found') res.end() return } //        200 OK, //       res.writeHead(200, {'Content-Type': mimeTypes[ext]}) //        const fileStream = fs.createReadStream(filePath) fileStream.pipe(res) }) 


Der gesamte Code wird auf Glitch gehostet, und Sie können das Projekt neu mischen, wenn Sie möchten.

https://glitch.com/edit/#!/node-http

Erstellen eines HTTP-Servers mit Node.js-Frameworks


Node.js Frameworks wie Express , Koa.js und Hapi.js bieten neben vielen anderen praktischen Funktionen verschiedene nützliche Middleware-Funktionen, die es Entwicklern ersparen, selbst schreiben zu müssen.

Persönlich denke ich, dass es besser ist, zuerst die Grundlagen ohne Frameworks zu lernen, nur um zu verstehen, was unter der Haube passiert, und dann mit jedem Framework, das Sie mögen, verrückt zu werden.

Express verfügt über ein eigenes integriertes Plugin zum Bereitstellen statischer Dateien, sodass der Code, der zum Ausführen derselben Aktionen wie in seiner eigenen Node.js erforderlich ist, viel kürzer ist.

 const express = require('express') const app = express() //         app.use(express.static('public')) //  index.html,      //     res.sendFile() app.get('/', (req, res) => { res.sendFile(__dirname + '/public/index.html') }) app.listen(5000) 

Koa.js hat kein ähnliches Plugin in seinem Kern, daher muss jedes erforderliche Plugin separat installiert werden. Die neueste Version von Koa.js verwendet asynchrone Funktionen zugunsten von Rückrufen. Sie können das koa-static Plugin verwenden, um statische Dateien bereitzustellen.

 const serve = require('koa-static') const koa = require('koa') const app = new koa() //         //   koa-static    index.html    app.use(serve(__dirname + '/public')) app.listen(5000) 

Hapi.js unterstützt die Anpassung und dreht sich um die Anpassung des Serverobjekts . Es verwendet Plugins, um Funktionen wie Routing, Authentifizierung usw. zu erweitern. Um statische Dateien bereitzustellen, benötigen wir ein Plugin namens inert .

 const path = require('path') const hapi = require('hapi') const inert = require('inert') //        const server = new hapi.Server({ port: 5000, routes: { files: { relativeTo: path.join(__dirname, 'public') } } }) const init = async () => { // server.register()      await server.register(inert) // inert     //       server.route({ method: 'GET', path: '/{param*}', handler: { directory: { path: '.', redirectToSlash: true, index: true } } }) await server.start() } init() 

Jede dieser Plattformen hat ihre Vor- und Nachteile. Sie sind für größere Anwendungen und nicht nur für die Bereitstellung einer einzelnen HTML-Seite offensichtlicher. Die Wahl der Struktur hängt stark von den tatsächlichen Anforderungen des Projekts ab, an dem Sie arbeiten.

Fertigstellung


Wenn die Netzwerkseite für Sie schon immer eine Black Box war, hoffe ich, dass dieser Artikel als nützliche Einführung in das Protokoll dienen kann, das das Netzwerk bereitstellt. Ich empfehle außerdem dringend, die API-Dokumentation zu Node.js zu lesen, die sehr gut geschrieben und für jeden Neuling bei Node.js im Allgemeinen sehr nützlich ist.

Source: https://habr.com/ru/post/de435970/


All Articles