2016-03-20 7 views
0

Das Ziel dieser Übung besteht darin, einen HTTP-Server zu erstellen, der für jede empfangene Anforderung dieselbe Textdatei bereitstellt. Hier ist mein Code. Es funktioniert nicht.HTTP-Dateiserver und die .writeHead-Methode

var http = require ('http'); 
    var fs = require ('fs'); 
    var port = process.argv[2]; 
    var file = process.argv[3]; 
    var bl = require ('bl'); 

var server = http.createServer(function (request, response) { 
    var stream = fs.createReadStream(file); 
    var streamPipe = stream.pipe(response); 
    response.write(streamPipe); 
    }); 

server.listen(port); 

überprüfte ich die richtige Antwort, und das ist den folgenden Code in der ersten Zeile der Funktion zu setzen und meine response.write remove() Methode:

response.writeHead(200, { 'content-type': 'text/plain' }); 

statt meinem Code , was ich dachte, die Daten aus dem Anforderungsstrom an den Antwortstrom (Leitung 10) geleitet schreiben würde:

response.write(streamPipe) 

ich verstehe nicht. Sollte nicht response.writeHead gehen, nachdem der Stream mit der. CreateReadStream-Methode eingerichtet wurde, und nicht vorher?

Sendet ich nicht bereits vorhandene Daten mit response.write()? Ich möchte, dass dies eine Zeichenfolge und kein Objekt zurückgibt, aber der Parameter muss zuerst eine Zeichenfolge sein, sonst funktioniert es nicht. Die toString() -Methode gibt [object Object] zurück.

Kann jemand bitte die Parameter der writeHead Methode erklären, und warum es vor allem anderen geht?

Ich weiß, das ist eine geladene Frage. Ich bin neu in Knoten, wirklich aufgeregt zu lernen, aber ich finde es nur so schwer zu verstehen. Ich habe ziemlich grundlegende JavaScript-Erfahrung und etwas Java, also schätze ich jede und alle Hilfe für einen aufstrebenden node.js Entwickler.

Antwort

0

Jede HTTP-Antwort hat drei Dinge: Status, Header und Inhalt (die leer sein können).

Status gibt einfach einen Status der Antwort an, z. 200 OK, 404 Not Found, 500 Internal Server Error usw.

Headers ist eine Folge von Paaren, die verschiedene key: value Meta-Daten über die Reaktion wie Content-Type: text/plain oder Content-Length: 123456 enthalten. Einige von ihnen sind obligatorisch wie Content-Length (tatsächlich gibt es einen Fall, wenn es nicht ist, d. H. Chunked-Codierung) und andere nicht.

Und schließlich Inhalt ist nur eine Sequenz von Bytes.

Und außerdem ist das genau die Reihenfolge dieser Dinge in HTTP-Antwort-Stream. Zuerst gibt es Status, dann Header und am Ende den Inhalt.

So rufen Sie immer response.writeHead Methode als erste, da diese Methode Status und Header an den Client sendet. Es akzeptiert ein Paar (status_code, headers_object) als Argumente, wobei status_code nur eine Zahl ist und headers_object ein Objekt {key1: value1, key2: value2} ist, das in Header-Sequenz konvertiert wird.

Schließlich sendet response.write Methode einen Teil des Inhalts an den Client. Es akzeptiert eine Zeichenfolge als Argument.

Lesen Sie mehr über Antwortmethoden hier: https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

Beachten Sie, dass response.write Methode nicht explizit in Ihrem Beispiel verwenden, weil stream.pipe(response) tut das unter der Haube für Sie. Lesen Sie dieses:

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options

+0

Sehr hilfreich. Ich habe die Dokumentation überprüft. Follow-up q - Können Sie in Laien erklären, was genau passiert mit Stream.pipe (Antwort)? Es sendet die Daten von der Quelle zur Antwort, richtig? Das Einschließen der response.writeHead() - Methode hat mein Problem gelöst und die Inhaltskette gesendet, aber das passiert, bevor diese "Pipe" überhaupt eingerichtet wird. Es ist sehr verwirrend für mich. – Streamer

+0

@Azurasky Sie können "Antwort" als Stream behandeln. Als erstes sendest du an diesen Stream Status und Header (d. H. Du nennst '.writeHead()'). Aber der Strom ist noch offen. So rufen Sie nun 'stream.pipe (response)' auf, das alles von einem lesbaren Stream-Stream an einen beschreibbaren Stream-Response sendet. Auf diese Weise füllen Sie den Inhalt der Antwort. Deshalb muss ".writeHead" vor ".pipe" stehen. Beachten Sie, dass '.pipe' den 'response' Stream danach automatisch schließt. Ich hoffe es ist jetzt klar. Fühlen Sie sich frei, mehr Fragen zu stellen. :) – freakish