Dieses Material schließt die manuelle Übersetzungsserie von Node.js. Heute werden wir über Betriebssysteme, Ereignisse und http-Module sprechen, die Arbeit mit Streams und Datenbanken diskutieren und die Verwendung von Node.js in der Anwendungsentwicklung und -produktion diskutieren.

[Wir empfehlen Ihnen zu lesen] Andere Teile des ZyklusTeil 1: 
Allgemeine Informationen und erste SchritteTeil 2: 
JavaScript, V8, einige EntwicklungstricksTeil 3: 
Hosting, REPL, Arbeit mit der Konsole, ModuleTeil 4: 
Dateien npm, package.json und package-lock.jsonTeil 5: 
npm und npxTeil 6: 
Ereignisschleife, Aufrufstapel, TimerTeil 7: 
Asynchrone ProgrammierungTeil 8: 
HTTP- und WebSocket-ProtokolleTeil 9: 
Arbeiten mit dem DateisystemTeil 10: 
Standardmodule, Threads, Datenbanken, NODE_ENVVollständiges PDF des Node.js-Handbuchs Node.js OS-Modul
Das Betriebssystemmodul bietet Zugriff auf viele Funktionen, mit denen Sie Informationen zum Betriebssystem und zur Hardware des Computers abrufen können, auf dem Node.js ausgeführt wird. Dies ist ein Standardmodul. Sie müssen es nicht installieren. Um mit dem Code zu arbeiten, schließen Sie es einfach an:
 const os = require('os') 
Hier gibt es einige nützliche Eigenschaften, die insbesondere beim Arbeiten mit Dateien nützlich sein können.
Mit der Eigenschaft 
os.EOL können 
os.EOL das im System verwendete Zeilentrennzeichen (ein Zeilenendezeichen) ermitteln. Unter Linux und MacOS ist dies 
\n , unter Windows 
\r\n .
Es sollte beachtet werden, dass wir, wenn wir hier „Linux und MacOS“ erwähnen, von POSIX-kompatiblen Plattformen sprechen. Der Kürze halber erwähnen wir hier nicht weniger beliebte Plattformen.
Die Eigenschaft 
os.constants.signals enthält Informationen zu den Konstanten, die zum Verarbeiten von Prozesssignalen wie 
SIGHUP , 
SIGKILL usw. verwendet werden. 
Hier finden Sie Details dazu.
Die Eigenschaft 
os.constants.errno enthält die Konstanten, die für Fehlermeldungen verwendet werden - wie 
EADDRINUSE , 
EOVERFLOW .
Betrachten Sie nun die Hauptmethoden des 
os Moduls.
▍os.arch ()
Diese Methode gibt eine Zeichenfolge zurück, die die Architektur des Systems identifiziert, z. B. 
arm , 
x64 , 
arm64 .
▍os.cpus ()
Gibt Informationen zu den im System verfügbaren Prozessoren zurück. Diese Informationen können beispielsweise folgendermaßen aussehen:
 [ { model: 'Intel(R) Core(TM)2 Duo CPU     P8600 @ 2.40GHz',   speed: 2400,   times:    { user: 281685380,      nice: 0,      sys: 187986530,      idle: 685833750,      irq: 0 } }, { model: 'Intel(R) Core(TM)2 Duo CPU     P8600 @ 2.40GHz',   speed: 2400,   times:    { user: 282348700,      nice: 0,      sys: 161800480,      idle: 703509470,      irq: 0 } } ] 
▍os.endianness ()
Gibt 
BE oder 
LE je nachdem, welche 
Bytereihenfolge (Big Engian oder Little Endian) zum Kompilieren der Binärdatei Node.js. verwendet wurde
▍os.freemem ()
Gibt die Menge des freien Systemspeichers in Bytes zurück.
▍os.homedir ()
Gibt den Pfad zum Ausgangsverzeichnis des aktuellen Benutzers zurück. Zum Beispiel 
'/Users/flavio' .
▍os.hostname ()
Gibt den Hostnamen zurück.
▍os.loadavg ()
Gibt in einem Array die vom Betriebssystem berechneten durchschnittlichen Lastdaten zurück. Diese Informationen sind nur unter Linux und MacOS sinnvoll. Es kann so aussehen:
 [ 3.68798828125, 4.00244140625, 11.1181640625 ] 
▍os.networkInterfaces ()
Gibt Informationen zu den auf dem System verfügbaren Netzwerkschnittstellen zurück. Zum Beispiel:
 { lo0:  [ { address: '127.0.0.1',      netmask: '255.0.0.0',      family: 'IPv4',      mac: 'fe:82:00:00:00:00',      internal: true },    { address: '::1',      netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',      family: 'IPv6',      mac: 'fe:82:00:00:00:00',      scopeid: 0,      internal: true },    { address: 'fe80::1',      netmask: 'ffff:ffff:ffff:ffff::',      family: 'IPv6',      mac: 'fe:82:00:00:00:00',      scopeid: 1,      internal: true } ], en1:  [ { address: 'fe82::9b:8282:d7e6:496e',      netmask: 'ffff:ffff:ffff:ffff::',      family: 'IPv6',      mac: '06:00:00:02:0e:00',      scopeid: 5,      internal: false },    { address: '192.168.1.38',      netmask: '255.255.255.0',      family: 'IPv4',      mac: '06:00:00:02:0e:00',      internal: false } ], utun0:  [ { address: 'fe80::2513:72bc:f405:61d0',      netmask: 'ffff:ffff:ffff:ffff::',      family: 'IPv6',      mac: 'fe:80:00:20:00:00',      scopeid: 8,      internal: false } ] } 
▍os.platform ()
Gibt Informationen zu der Plattform zurück, für die Node.js. kompiliert wurde. Hier sind einige der möglichen Rückgabewerte:
- Darwin
- freebsd
- Linux
- openbsd
- win32
▍os.release ()
Gibt eine Zeichenfolge zurück, die die Versionsnummer des Betriebssystems angibt.
▍os.tmpdir ()
Gibt den Pfad zu dem im System angegebenen Verzeichnis zum Speichern temporärer Dateien zurück.
▍os.totalmem ()
Gibt die Gesamtmenge des Systemspeichers in Bytes zurück.
▍os.type ()
Gibt Informationen zurück, die das Betriebssystem identifizieren. Zum Beispiel:
- Linux- Linux.
- Darwin- macOS.
- Windows_NT- Windows.
▍os.uptime ()
Gibt die Systemverfügbarkeit in Sekunden seit dem letzten Neustart zurück.
Node.js Ereignismodul
Das 
events stellt uns die 
EventEmitter Klasse zur Verfügung, die für die Arbeit mit Ereignissen auf der Node.js-Plattform ausgelegt ist. Wir haben bereits im 
siebten Teil dieser Materialreihe ein wenig über dieses Modul gesprochen. 
Hier ist die Dokumentation dafür. Hier sehen wir uns die API dieses Moduls an. Denken Sie daran, dass Sie zur Verbindung im Code eine Verbindung herstellen müssen, wie dies normalerweise bei Standardmodulen der Fall ist. Danach müssen Sie ein neues 
EventEmitter Objekt erstellen. Es sieht so aus:
 const EventEmitter = require('events') const door = new EventEmitter() 
Das Objekt der 
EventEmitter Klasse verwendet Standardmechanismen, insbesondere die folgenden Ereignisse:
- newListener- Dieses Ereignis wird- newListenerwenn ein Ereignishandler hinzugefügt wird.
- removeListener- wird aufgerufen, wenn der Handler entfernt wird.
Betrachten Sie die nützlichsten Methoden von Objekten der 
EventEmitter Klasse (ein ähnliches Objekt in den Namen der Methoden wird als 
emitter ).
▍emitter.addListener ()
Ein Alias für die Methode 
emitter.on() .
▍emitter.emit ()
Erzeugt ein Ereignis. Ruft alle Ereignishandler synchron in der Reihenfolge auf, in der sie registriert wurden.
▍emitter.eventNames ()
Gibt ein Array zurück, das die registrierten Ereignisse enthält.
▍emitter.getMaxListeners ()
Gibt die maximale Anzahl von 
EventEmitter , die einem Objekt der 
EventEmitter Klasse hinzugefügt werden können. Der Standardwert ist 10. Bei Bedarf kann dieser Parameter mit der Methode 
setMaxListeners() erhöht oder verringert werden.
▍emitter.listenerCount ()
Gibt die Anzahl der Ereignishandler zurück, deren Name als Parameter an diese Methode übergeben wird:
 door.listenerCount('open') 
▍emitter.listeners ()
Gibt ein Array von Ereignishandlern für das entsprechende Ereignis zurück, dessen Name an diese Methode übergeben wird:
 door.listeners('open') 
▍emitter.off ()
Ein Alias für die in Knoten 10 eingeführte Methode 
emitter.removeListener() .
▍emitter.on ()
Registrieren Sie einen Rückruf, der aufgerufen wird, wenn ein Ereignis generiert wird. So verwenden Sie es:
 door.on('open', () => { console.log('Door was opened') }) 
▍emitter.once ()
Es registriert einen Rückruf, der nur einmal aufgerufen wird - beim ersten Auftreten eines Ereignisses, für das dieser Rückruf registriert ist. Zum Beispiel:
 const EventEmitter = require('events') const ee = new EventEmitter() ee.once('my-event', () => {  
▍emitter.prependListener ()
Wenn Sie einen Handler mit den Methoden 
on() oder 
addListener() registrieren, wird dieser Handler am Ende der 
addListener() hinzugefügt und zuletzt aufgerufen, um das entsprechende Ereignis zu behandeln. Bei Verwendung der 
prependListener() -Methode wird der Handler an der Vorderseite der Warteschlange hinzugefügt, wodurch er zuerst aufgerufen wird, um das Ereignis zu verarbeiten.
▍emitter.prependOnceListener ()
Diese Methode ähnelt der vorherigen. Wenn ein Handler, der für einen einzelnen Aufruf vorgesehen ist, mit der Methode 
once() registriert wird, stellt sich heraus, dass er der letzte in der Warteschlange der Handler und der letzte ist, der aufgerufen wird. Mit der Methode 
prependOnceListener() können Sie einen solchen Handler an der Vorderseite der Warteschlange hinzufügen.
▍emitter.removeAllListeners ()
Diese Methode löscht alle Handler für ein bestimmtes Ereignis, das im entsprechenden Objekt registriert ist. Sie benutzen es so:
 door.removeAllListeners('open') 
▍emitter.removeListener ()
Löscht den angegebenen Handler, der an diese Methode übergeben werden soll. Um den Handler für das spätere Löschen zu speichern, kann der entsprechende Rückruf einer Variablen zugeordnet werden. Es sieht so aus:
 const doSomething = () => {} door.on('open', doSomething) door.removeListener('open', doSomething) 
▍emitter.setMaxListeners ()
Mit dieser Methode können Sie die maximale Anzahl von 
EventEmitter angeben, die einem einzelnen Ereignis in einer Instanz der 
EventEmitter Klasse 
EventEmitter . Wie bereits erwähnt, können Sie standardmäßig bis zu 10 Handler für ein bestimmtes Ereignis hinzufügen. Dieser Wert kann geändert werden. Verwenden Sie diese Methode wie folgt:
 door.setMaxListeners(50) 
Node.js http-Modul
Im 
achten Teil dieser Materialreihe haben wir bereits über das Standardmodul Node.js 
http . Er stellt die Entwicklermechanismen zur Verfügung, mit denen HTTP-Server erstellt werden sollen. Es ist das Hauptmodul zur Lösung der Probleme des Datenaustauschs über das Netzwerk in Node.js. Sie können es im Code wie folgt verbinden:
 const http = require('http') 
Es besteht aus Eigenschaften, Methoden und Klassen. Reden wir über sie.
▍Eigenschaften
http.METHODS
Diese Eigenschaft listet alle unterstützten HTTP-Methoden auf:
 > require('http').METHODS [ 'ACL', 'BIND', 'CHECKOUT', 'CONNECT', 'COPY', 'DELETE', 'GET', 'HEAD', 'LINK', 'LOCK', 'M-SEARCH', 'MERGE', 'MKACTIVITY', 'MKCALENDAR', 'MKCOL', 'MOVE', 'NOTIFY', 'OPTIONS', 'PATCH', 'POST', 'PROPFIND', 'PROPPATCH', 'PURGE', 'PUT', 'REBIND', 'REPORT', 'SEARCH', 'SUBSCRIBE', 'TRACE', 'UNBIND', 'UNLINK', 'UNLOCK', 'UNSUBSCRIBE' ] 
http.STATUS_CODES
Es enthält die HTTP-Statuscodes und ihre Beschreibungen:
 > require('http').STATUS_CODES { '100': 'Continue', '101': 'Switching Protocols', '102': 'Processing', '200': 'OK', '201': 'Created', '202': 'Accepted', '203': 'Non-Authoritative Information', '204': 'No Content', '205': 'Reset Content', '206': 'Partial Content', '207': 'Multi-Status', '208': 'Already Reported', '226': 'IM Used', '300': 'Multiple Choices', '301': 'Moved Permanently', '302': 'Found', '303': 'See Other', '304': 'Not Modified', '305': 'Use Proxy', '307': 'Temporary Redirect', '308': 'Permanent Redirect', '400': 'Bad Request', '401': 'Unauthorized', '402': 'Payment Required', '403': 'Forbidden', '404': 'Not Found', '405': 'Method Not Allowed', '406': 'Not Acceptable', '407': 'Proxy Authentication Required', '408': 'Request Timeout', '409': 'Conflict', '410': 'Gone', '411': 'Length Required', '412': 'Precondition Failed', '413': 'Payload Too Large', '414': 'URI Too Long', '415': 'Unsupported Media Type', '416': 'Range Not Satisfiable', '417': 'Expectation Failed', '418': 'I\'ma teapot', '421': 'Misdirected Request', '422': 'Unprocessable Entity', '423': 'Locked', '424': 'Failed Dependency', '425': 'Unordered Collection', '426': 'Upgrade Required', '428': 'Precondition Required', '429': 'Too Many Requests', '431': 'Request Header Fields Too Large', '451': 'Unavailable For Legal Reasons', '500': 'Internal Server Error', '501': 'Not Implemented', '502': 'Bad Gateway', '503': 'Service Unavailable', '504': 'Gateway Timeout', '505': 'HTTP Version Not Supported', '506': 'Variant Also Negotiates', '507': 'Insufficient Storage', '508': 'Loop Detected', '509': 'Bandwidth Limit Exceeded', '510': 'Not Extended', '511': 'Network Authentication Required' } 
http.globalAgent
Diese Eigenschaft verweist auf die globale Instanz der 
http.Agent Klasse. Es wird zum Verwalten von Verbindungen verwendet. Es kann als Schlüsselkomponente des HTTP-Subsystems Node.js. betrachtet werden. Wir werden weiter unten mehr über die Klasse 
http.Agent sprechen.
▍Methoden
http.createServer ()
Gibt eine neue Instanz der 
http.Server Klasse zurück. So verwenden Sie diese Methode zum Erstellen eines HTTP-Servers:
 const server = http.createServer((req, res) => {  
http.request ()
Ermöglicht das Erstellen einer HTTP-Anforderung an den Server, indem eine Instanz der Klasse 
http.ClientRequest .
http.get ()
Diese Methode ähnelt 
http.request() , setzt jedoch die HTTP-Methode automatisch auf 
GET und ruft automatisch einen Befehl der Form 
req.end() .
▍ Klassen
Das HTTP-Modul bietet 5 Klassen: 
Agent , 
ClientRequest , 
Server , 
ServerResponse und 
IncomingMessage . Betrachten Sie sie.
http.Agent
Die globale Instanz der von Node.js erstellten 
http.Agent Klasse wird zum Verwalten von Verbindungen verwendet. Es wird als Standardwert für alle HTTP-Anforderungen verwendet und ermöglicht das Einreihen und Wiederverwenden von Sockets. Darüber hinaus unterstützt es einen Socket-Pool, der eine hohe Leistung des Node.js.-Netzwerksubsystems ermöglicht. Bei Bedarf können Sie Ihr eigenes 
http.Agent Objekt erstellen.
http.ClientRequest
Ein Objekt der 
http.ClientRequest Klasse, bei der es sich um eine laufende Anforderung handelt, wird beim 
http.request() Methoden 
http.request() oder 
http.get() . Wenn eine Antwort auf eine Anfrage empfangen wird, wird das Antwortereignis 
http.IncomingMessage , in dem die Antwort übertragen wird - eine Instanz von 
http.IncomingMessage . Die nach Abschluss der Abfrage erhaltenen Daten können auf zwei Arten verarbeitet werden:
- Sie können die Methode response.read()aufrufen.
- Im Handler für responsekönnen Sie einen Listener für das Datenereignis konfigurieren, mit dem Sie mit Streaming-Daten arbeiten können.
http.Server
Instanzen dieser Klasse werden zum Erstellen von Servern mit dem Befehl 
http.createServer() . Nachdem wir ein Serverobjekt haben, können wir seine Methoden verwenden:
- Die listen()-Methode wird verwendet, um den Server zu starten und das Warten und Verarbeiten eingehender Anforderungen zu organisieren.
- Die Methode close()stoppt den Server.
http.ServerResponse
Dieses Objekt wird von der 
http.Server Klasse erstellt und beim 
http.Server als zweiter Parameter an das 
request . In der Regel wird solchen Objekten im Code der Name 
res zugewiesen:
 const server = http.createServer((req, res) => {  
In solchen Handlern wird, nachdem die Serverantwort zum Senden an den Client bereit ist, die 
end() -Methode aufgerufen, die die Antwort vervollständigt. Diese Methode muss nach Abschluss jeder Antwort aufgerufen werden.
Hier sind die Methoden zum Arbeiten mit HTTP-Headern:
- getHeaderNames()-- getHeaderNames()eine Liste der Namen der installierten Header zurück.
- getHeaders()- gibt eine Kopie der festgelegten HTTP-Header zurück.
- setHeader('headername', value)-- setHeader('headername', value)den Wert für den angegebenen Header fest.
- getHeader('headername')- gibt den gesetzten Header zurück.
- removeHeader('headername')-- removeHeader('headername')den installierten Header.
- hasHeader('headername')- gibt- truezurück- truewenn die Antwort bereits einen Header enthält, dessen Name an diese Methode übergeben wird.
- headersSent()- gibt- truezurück- truewenn Header bereits an den Client gesendet wurden.
Nach der Verarbeitung der Header können sie durch Aufrufen der Methode 
response.writeHead() an den Client gesendet werden, die als ersten Parameter einen Statuscode annimmt. Als zweiter und dritter Parameter kann eine Nachricht, die dem Statuscode und den Headern entspricht, an diesen übergeben werden.
Um Daten an den Client zu senden, wird im Antworttext die Methode 
write() verwendet. Es sendet gepufferte Daten an den HTTP-Antwortstrom.
Wenn mit dem Befehl 
response.writeHead() noch keine Header festgelegt wurden, werden zuerst Header mit dem in der Anforderung angegebenen Statuscode und der in der Anforderung angegebenen Nachricht gesendet. Sie können ihre Werte festlegen, indem Sie Werte für die 
statusMessage statusCode und 
statusMessage :
 response.statusCode = 500 response.statusMessage =  
http.IncomingMessage
Ein Objekt der 
http.IncomingMessage Klasse wird im Verlauf der folgenden Mechanismen erstellt:
- http.Server- bei der Verarbeitung des- request.
- http.ClientRequest- bei der Behandlung des- response.
Es kann verwendet werden, um mit Antwortdaten zu arbeiten. Nämlich:
- Um den Antwortstatuscode und die entsprechende Nachricht herauszufinden, werden die Eigenschaften statusCodeundstatusMessageverwendet.
- Sie können die rawHeardersheadersrawHeardersoderrawHearders(für eine Liste der rohen Header).
- Sie können die Anforderungsmethode mithilfe der methodEigenschaft ermitteln.
- Verwenden Sie die Eigenschaft httpVersion, um herauszufinden, welche Version von HTTP verwendet wird.
- Um die URL url, ist dieurlEigenschaft vorgesehen.
- Mit der socketEigenschaft können Sie das der Verbindung zugeordnetenet.SocketObjektnet.Socket.
Die Antwortdaten werden als Stream dargestellt, da das 
http.IncomingMessage Objekt die 
Readable Stream Schnittstelle implementiert.
Arbeiten Sie mit Streams in Node.js.
Threads sind eines der grundlegenden Konzepte, die in Node.js-Anwendungen verwendet werden. Streams sind Tools, mit denen Sie Dateien lesen und schreiben, die Netzwerkinteraktion zwischen Systemen organisieren und Datenaustauschvorgänge im Allgemeinen effektiv implementieren können.
Das Konzept der Threads gilt nicht nur für Node.js. Sie erschienen vor Jahrzehnten in der Unix-Betriebssystemfamilie. Insbesondere können Programme miteinander interagieren und Datenströme über Pipelines übertragen (unter Verwendung des Pipe-Zeichens - 
| ).
Wenn wir uns beispielsweise vorstellen, eine Datei ohne Verwendung von Streams zu lesen, wird während der Ausführung des entsprechenden Befehls der Inhalt der Datei vollständig in den Speicher eingelesen, wonach mit diesen Inhalten gearbeitet werden kann.
Dank des Flow-Mechanismus können Dateien in Teilen gelesen und verarbeitet werden, sodass keine großen Datenmengen im Speicher gespeichert werden müssen.
Das 
Stream- Modul Node.js ist die Grundlage, auf der alle APIs basieren, die Streaming unterstützen.
▍Über die Stärken der Verwendung von Streams
Streams haben im Vergleich zu anderen Methoden der Datenverarbeitung folgende Vorteile:
- Effiziente Speichernutzung. Das Arbeiten mit einem Stream bedeutet nicht, dass große Datenmengen, die dort im Voraus geladen wurden, im Speicher gespeichert werden, bevor sie verarbeitet werden können.
- Zeitersparnis. Vom Stream empfangene Daten können viel schneller verarbeitet werden, als wenn Sie warten müssen, bis sie vollständig geladen sind, um mit der Verarbeitung zu beginnen.
▍ Beispiel für die Arbeit mit Streams
Ein traditionelles Beispiel für die Arbeit mit Streams zeigt das Lesen einer Datei von der Festplatte.
Betrachten Sie zunächst Code, in dem keine Threads verwendet werden. Mit dem Standardmodul Node.js 
fs können Sie eine Datei lesen und anschließend als Antwort auf eine von einem HTTP-Server empfangene Anforderung über HTTP übertragen werden:
 const http = require('http') const fs = require('fs') const server = http.createServer(function (req, res) { fs.readFile(__dirname + '/data.txt', (err, data) => {   res.end(data) }) }) server.listen(3000) 
Mit der hier verwendeten Methode 
readFile() können Sie die gesamte Datei lesen. Wenn der Lesevorgang abgeschlossen ist, wird der entsprechende Rückruf aufgerufen.
Die im Rückruf aufgerufene Methode 
res.end(data) sendet den Inhalt der Datei an den Client.
Wenn die Dateigröße groß ist, nimmt dieser Vorgang viel Zeit in Anspruch. Hier ist das gleiche Beispiel, das mit Streams neu geschrieben wurde:
 const http = require('http') const fs = require('fs') const server = http.createServer((req, res) => { const stream = fs.createReadStream(__dirname + '/data.txt') stream.pipe(res) }) server.listen(3000) 
Anstatt auf den Moment zu warten, in dem die Datei vollständig gelesen wurde, beginnen wir sofort, ihre Daten an den Client zu übertragen, nachdem der erste Teil dieser Daten zum Senden bereit ist.
▍Pipe () -Methode
Im vorherigen Beispiel haben wir eine Konstruktion des Formulars 
stream.pipe(res) , in der die Dateistream-Methode 
pipe() aufgerufen wird. Diese Methode nimmt Daten von ihrer Quelle und sendet sie an das Ziel.
Es wird für einen Stream aufgerufen, der eine Datenquelle darstellt. In diesem Fall ist dies der Dateistream, der an die HTTP-Antwort gesendet wird.
Der Rückgabewert der 
pipe() -Methode ist der Zielstrom. Dies ist sehr praktisch, da Sie damit mehrere Aufrufe an die 
pipe() -Methode verketten können:
 src.pipe(dest1).pipe(dest2) 
Dies entspricht einem solchen Design:
 src.pipe(dest1) dest1.pipe(dest2) 
▍API Node.js, die Streams verwenden
Streams sind ein nützlicher Mechanismus. Daher bieten viele Module des Node.js-Kernels Standardfunktionen für die Arbeit mit Streams. Wir listen einige davon auf:
- process.stdin- gibt einen mit- stdinverbundenen Thread zurück.
- process.stdout- Gibt den mit- stdoutverbundenen Thread zurück.
- process.stderr- gibt einen mit- stderrverbundenen Thread zurück.
- fs.createReadStream()-- fs.createReadStream()einen lesbaren Stream für die Arbeit mit einer Datei.
- fs.createWriteStream()-- fs.createWriteStream()einen beschreibbaren Stream für die Arbeit mit einer Datei.
- net.connect()- initiiert eine Stream-basierte Verbindung.
- http.request()-- http.request()eine Instanz der- http.ClientRequestKlasse zurück, die den Zugriff auf den zu schreibenden Stream ermöglicht.
- zlib.createGzip()- komprimiert Daten mithilfe des- gzipAlgorithmus und sendet sie an den Stream.
- zlib.createGunzip()- dekomprimiert einen- gzipStream.
- zlib.createDeflate()- komprimiert Daten mithilfe des- deflateAlgorithmus und sendet sie an den Stream.
- zlib.createInflate()- dekomprimiert einen- deflateStream.
▍Verschiedene Arten von Streams
Es gibt vier Arten von Streams:
- Ein lesbarer Stream ist ein Stream, aus dem Daten gelesen werden können. Sie können keine Daten in einen solchen Stream schreiben. Wenn Daten in einem solchen Stream ankommen, werden sie gepuffert, bis der Datenkonsument beginnt, sie zu lesen.
- Ein Stream zum Schreiben (beschreibbar) ist ein Stream, in dem Sie Daten senden können. Sie können keine Daten daraus lesen.
- Duplex-Stream ( Duplex) - In diesem Stream können Sie Daten senden und daraus lesen. Im Wesentlichen ist dies eine Kombination aus einem Stream zum Lesen und einem Stream zum Schreiben.
- Stream transformieren ( Transform) - Solche Streams ähneln Duplex-Streams. Der Unterschied besteht darin, dass die Eingabe dieser Streams das transformiert, was von ihnen gelesen werden kann.
▍Erstellen Sie einen Lesestream
, 
stream :
 const Stream = require('stream') const readableStream = new Stream.Readable() 
, :
 readableStream.push('hi!') readableStream.push('ho!') 
▍
Writable _write() . :
 const Stream = require('stream') const writableStream = new Stream.Writable() 
_write() :
 writableStream._write = (chunk, encoding, next) => {   console.log(chunk.toString())   next() } 
, :
 process.stdin.pipe(writableStream) 
▍
, , :
 const Stream = require('stream') const readableStream = new Stream.Readable() const writableStream = new Stream.Writable() writableStream._write = (chunk, encoding, next) => {   console.log(chunk.toString())   next() } readableStream.pipe(writableStream) readableStream.push('hi!') readableStream.push('ho!') readableStream.push(null) 
readableStream.push(null) .
, 
readable :
 readableStream.on('readable', () => { console.log(readableStream.read()) }) 
▍
write() :
 writableStream.write('hey!\n') 
▍ ,
, , 
end() :
 writableStream.end() 
. , , .
MySQL Node.js
MySQL . Node.js , MySQL-, — , .
mysqljs/mysql . , , 12000 GitHub. , MySQL-.
▍
:
 npm install mysql 
▍
:
 const mysql = require('mysql') 
:
 const options = { user: 'the_mysql_user_name', password: 'the_mysql_user_password', database: 'the_mysql_database_name' } const connection = mysql.createConnection(options) 
:
 connection.connect(err => { if (err) {   console.error('An error occurred while connecting to the DB')   throw err } } 
▍
options :
 const options = { user: 'the_mysql_user_name', password: 'the_mysql_user_password', database: 'the_mysql_database_name' } 
. — :
- host— , MySQL-, —- localhost.
- port— , —- 3306.
- socketPath— Unix .
- debug— , .
- trace— , .
- ssl— SSL- .
▍ SELECT
SQL- . 
query , . — , . . :
 connection.query('SELECT * FROM todos', (error, todos, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } console.log(todos) }) 
, :
 const id = 223 connection.query('SELECT * FROM todos WHERE id = ?', [id], (error, todos, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } console.log(todos) }) 
, , :
 const id = 223 const author = 'Flavio' connection.query('SELECT * FROM todos WHERE id = ? AND author = ?', [id, author], (error, todos, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } console.log(todos) }) 
▍ INSERT
INSERT . , :
 const todo = { thing: 'Buy the milk' author: 'Flavio' } connection.query('INSERT INTO todos SET ?', todo, (error, results, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error } }) 
, , 
auto_increment , 
results.insertId :
 const todo = { thing: 'Buy the milk' author: 'Flavio' } connection.query('INSERT INTO todos SET ?', todo, (error, results, fields) => { if (error) {   console.error('An error occurred while executing the query')   throw error }} const id = results.resultId console.log(id) ) 
▍
— 
end() :
 connection.end() 
.
-
Node.js -.
Node.js . , -, 
NODE_ENV :
 NODE_ENV=production 
. Linux, , :
 export NODE_ENV=production 
, , 
.bash_profile ( Bash), .
, :
 NODE_ENV=production node app.js 
Node.js. 
NODE_ENV production :
, 
Pug — , Express, , 
NODE_ENV production . Express, , . - . .
Express . , , 
NODE_ENV :
 app.configure('development', () => { //... }) app.configure('production', () => { //... }) app.configure('production', 'staging', () => { //... }) 
, :
 app.configure('development', () => { app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }) app.configure('production', () => { app.use(express.errorHandler()) }) 
▍
, , Node.js , . , , , Node.js, - , 
Node.js.
Liebe Leser! , Node.js, , .
