Heim > Artikel > Web-Frontend > Eine kurze Analyse des Readable-Objekts im Stream-Modul von Node.js_node.js
Ich habe immer gezögert, über NodeJS zu sprechen, denn als ich es zum ersten Mal sah, fand ich sein Design wirklich ekelhaft. Aber es gibt keine Möglichkeit, die Stream-Spezifikation ist noch nicht populär geworden, und es gibt in der Tat viele Dinge, deren Implementierung auf dem NodeJS-Stream beruht, also kann ich nur meine Nase halten und in den sauren Apfel beißen und daran ziehen Das riecht und ist hart.
Nodejs enthält ein Modul namens Stream. Durch die Einführung können Sie eine Reihe von Stream-Objektkonstruktoren erhalten. Jetzt spreche ich nur über den einfachsten Stream.Readable.
Tatsächlich ist fast jeder, der NodeJS verwendet hat, mit Readable-Instanzen in Berührung gekommen, aber sie schenken ihnen einfach nicht viel Aufmerksamkeit. Ein sehr typisches Beispiel: Im http-Modul haben wir req- und res-Objekte, wenn jede Anforderung ein lesbares Objekt ist. Wir können den Entitätsteil der HTTP-Anfrage in Form eines Streams auf dieser Anforderung lesen.
Die Frage ist also: Warum ist das http-Modul hier im Streaming-Stil konzipiert? Oder um diese Frage aus einer anderen Dimension zu stellen: „Wie erhält NodeJS den Inhalt der POST-Anfrage?“ Studierende, die mit Suchmaschinen umgehen können, können eine solche Antwort auf jeden Fall leicht finden: Hören Sie sich das Datenereignis an, um Daten zu sammeln, und führen Sie die gesammelten Daten am Ende des Ereignisses zusammen. Ja, das ist die Lösung für dieses Problem. Aber warum ist es so konzipiert? Wie großartig wäre es, den POST-Inhalt direkt wie PHP abrufen zu können? Tatsächlich ist dieses Design von Vorteil. Wenn die Daten, die wir erhalten, illegal sind, kann ich sie sofort erkennen, reagieren und die Verbindung trennen. Dadurch können einige unnötige Übertragungskosten vermieden werden. Wenn der Benutzer beispielsweise ein Bild hochlädt, wählt er möglicherweise versehentlich eine große ausführbare Datei aus. Wir müssen nicht warten, bis die Datei vollständig hochgeladen ist. Wir benötigen nur einige Bytes im Dateikopf, um festzustellen, ob es sich bei einer Datei um ein Bild handelt . Mithilfe des Stream-Designs können Sie hier zunächst die ersten paar Bytes zur Verwendung auslesen.
Das oben erwähnte Datenereignis und das Endereignis sind beide lesbare Ereignisse. Diese beiden Ereignisse zeigen den Empfang von Daten bzw. den Abschluss des Datenempfangs an. Tatsächlich kennen wir die Verwendung von Readable bereits, aber viele Leute wissen nicht, dass es sich um ein Readable-Objekt handelt.
Die beiden oben genannten Ereignisse sind jedoch nur Ereignisse für Verbraucher von Readable. Wie werden Daten intern in das Readable-Objekt verschoben, damit Readable diese Ereignisse auslösen kann? Dann ist es die Push-Methode. Hier ist ein Beispiel, das ein lesbares Objekt erstellt, das eine inkrementelle Zahl streamt (hier wird der Babel-Knoten verwendet)
import stream from 'stream'; var r = new stream.Readable; r.on('data', data => { console.log(data + ''); }); r.on('end', data => { console.log('end'); }); r._read = () => { // console.log('before read'); }; void function callee(i) { if(i < 10) { r.push(i + ''); // 只能传入字符串或 Buffre 对象 } else { r.push(null); // 当输入一个 null 时表示流传输完成,触发 end 事件 } setTimeout(callee, 500, i + 1); }(0);
Wenn Sie sich den obigen Code genau ansehen, werden Sie einen sehr magischen Ort finden. Dieser Code überschreibt die _read-Methode. Tatsächlich denke ich auch, dass dies eine Falle ist. Ich werde mich nicht über diesen privaten Namensstil beschweren. Warum muss ich diese Methode überschreiben, um sie zu implementieren? Wenn diese Methode nicht überschrieben wird, wird beim Aufruf von push eine Ausnahme ausgelöst:
Error: not implemented at Readable._read (_stream_readable.js:464:22) at Readable.read (_stream_readable.js:341:10)
Das Obige ist die grundlegende Verwendung lesbarer Objekte. Es gibt jedoch noch weitere Fallstricke. Dieser Artikel ist nur die einfachste Einführung, damit jeder lernen kann, wie man ein lesbares Objekt erstellt, das Daten ausgeben kann. Was einige grundlegende Methoden wie Lesen betrifft, gehören diese ohnehin ebenfalls zu den unwissenschaftlichen Designs.