Frage Verwenden von pipe () in Node.js net


Ich habe Probleme, meinen Kopf um den Kopf zu legen pipe Funktion in mehreren Node.js Beispielen für die Netz Modul.

var net = require('net');

var server = net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.pipe(socket);
});

Kann mir jemand erklären, wie das funktioniert und warum es benötigt wird?


50
2017-11-20 01:11


Ursprung


Antworten:


Das pipe() Funktion liest Daten aus einem lesbaren Stream, sobald dieser verfügbar wird, und schreibt sie in einen beschreibbaren Zielstream.

Das Beispiel in der Dokumentation ist ein Echo-Server, der ein Server ist, der sendet, was er empfängt. Das socket Object implementiert sowohl die lesbare als auch die beschreibbare Stream-Schnittstelle, schreibt also alle empfangenen Daten zurück an den Socket.

Dies ist das Äquivalent zur Verwendung der pipe() Methode, die Ereignis-Listener verwendet:

var net = require('net');
net.createServer(function (socket) {
  socket.write('Echo server\r\n');
  socket.on('data', function(chunk) {
    socket.write(chunk);
  });
  socket.on('end', socket.end);
});

71
2017-11-20 01:32



pipe() liest aus einem lesbaren Stream und schreibt in einen beschreibbaren Stream, ähnlich wie eine Unix-Pipe. Es macht alle "vernünftigen" Dinge auf dem Weg mit Fehlern, Ende der Dateien, wenn eine Seite zurückfällt usw. Ihr spezielles Beispiel ist etwas verwirrend, weil die socket ist sowohl lesbar als auch beschreibbar.

Ein leichter zu verstehendes Beispiel ist in dieser SO Frage wo Sie von einer HTTP-Anfrage lesen und in eine HTTP-Antwort schreiben.


3
2017-11-20 02:51



Es gibt 2 Sockets pro Server-Client-Verbindung (2 Endpunkte). Socket bindet IP Address:Port Number. Dem Client werden zufällige Portnummern zugewiesen, während der Server eine dedizierte Portnummer hat. Dies ist die grundlegende Erklärung dafür, wie Socket funktioniert.

Piping ist für das Umleiten eines lesbaren Streams in einen beschreibbaren Stream reserviert.

Was socket.pipe(socket) tut das? Es leitet alle Daten vom lesbaren Stream (Server) zum beschreibbaren Stream (Client) um. Wir können dies optimieren, indem wir Event-Listener hinzufügen, wie @hexacyanide es betont hat.


1
2017-12-23 08:01



Betrachten Sie den folgenden Anforderungshandler

var server = http.createServer(function(req, res){
     console.log('Request for ' + req.url + ' by method ' + req.method);
    if(req.method == 'GET'){
        var fileurl;
        if(req.url == '/')fileurl = '/index.html';
        else {
            fileurl = req.url;
        }
    }
    var filePath = path.resolve('./public'+fileurl);
    var fileExt = path.extname(filePath);
    if(fileExt == '.html'){
          fs.exists(filePath, function(exists){
        if(!exists){
          res.writeHead(404, {'Content-Type': 'text/html'});
          res.end('<h1>Error 404' + filePath + 'not found </h1>');
          //the end() method sends content of the response to the client
          //and signals to the server that the response has been sent
          //completely
          return;
        }
        res.writeHead(200, {'Content-Type':'text/html'});
        fs.createReadStream(filePath).pipe(res);
      })
    }
}

Das fs.createReadStream Methode liest die Datei im angegebenen Dateipfad (public/index.html) und pipe() schreibt es in die Antwort (res) für die Sicht des Kunden.


1
2018-05-11 08:50