2016-03-20 4 views
0

Le but de cet exercice est de créer un serveur HTTP qui traite le même fichier texte pour chaque requête qu'il reçoit. Voici mon code. Ça ne marche pas.Serveurs de fichiers HTTP et méthode .writeHead

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); 

j'ai vérifié la bonne réponse, et qui est de placer le code suivant à la première ligne de la fonction, et enlever ma méthode Response.Write():

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

au lieu de mon code , que je pensais écrire les données canalisés du flux de demande au flux de réponse (ligne 10):

response.write(streamPipe) 

Je ne comprends pas. Ne devrait pas répondre.writeHead après que le flux est établi en utilisant la méthode .createReadStream, et pas avant?

N'envoyez-vous pas déjà des données avec response.write()? Je veux que cela renvoie une chaîne et non un objet, mais le paramètre doit être une chaîne en premier, sinon cela ne fonctionne pas. La méthode toString() renvoie [object Object]. Est-ce que quelqu'un peut expliquer les paramètres de la méthode writeHead, et pourquoi cela va-t-il avant tout le reste?

Je réalise que c'est une question chargée. Je suis nouveau au nœud, vraiment excité d'apprendre, mais je le trouve si difficile à comprendre. J'ai une expérience JavaScript assez basique, et un peu de Java, donc j'apprécie toute l'aide pour un aspirant développeur node.js.

Répondre

0

Chaque réponse HTTP a trois choses: l'état, les en-têtes et le contenu (qui peut être vide). L'état

indique simplement un état de réponse, par ex. 200 OK, 404 Not Found, 500 Internal Server Error, etc.

de coupe est une séquence de paires key: value qui contiennent différents des méta-données à propos de la réponse comme Content-Type: text/plain ou Content-Length: 123456. Certains d'entre eux sont obligatoires comme Content-Length (en fait il y a un cas où ce n'est pas le cas, c'est-à-dire l'encodage en morceaux) et d'autres ne le sont pas.

Et enfin le contenu est juste une séquence d'octets.

Et de plus c'est exactement l'ordre de ces choses dans le flux de réponse HTTP. D'abord, il y a le statut, puis les en-têtes et à la fin le contenu.

Ainsi, vous appelez toujours la méthode response.writeHead en premier parce que cette méthode envoie à la fois le statut et les en-têtes au client. Il accepte une paire (status_code, headers_object) comme arguments où status_code est juste un nombre et headers_object est un objet {key1: value1, key2: value2} qui sera converti en séquence d'en-têtes.

Enfin, la méthode response.write envoie un fragment du contenu au client. Il accepte une chaîne comme argument.

En savoir plus sur les méthodes de réponse ici: https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

Notez que vous n'utilisez pas la méthode response.write dans votre exemple explicitement parce stream.pipe(response) fait ça sous le capot pour vous. Lire ceci:

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

+0

Très utile. J'ai vérifié la documentation. Suivi q - pouvez-vous expliquer en termes simples ce qui se passe exactement avec stream.pipe (réponse)? Il envoie les données de la source à la réponse, non? Y compris la méthode response.writeHead() a résolu mon problème et a envoyé la chaîne de contenu, mais cela se produit avant que ce "tuyau" ne soit même établi. C'est super confus pour moi. – Streamer

+0

@Azurasky Vous pouvez traiter 'response' comme un flux. La première chose que vous envoyez à ce flux est le statut et les en-têtes (c'est-à-dire que vous appelez '.writeHead()'). Mais le flux est toujours ouvert. Donc maintenant vous appelez 'stream.pipe (response)' qui envoie tout d'un flux lisible 'stream' à un flux inscriptible' response'. De cette façon, vous remplissez le contenu de la réponse. C'est pourquoi '.writeHead' doit arriver avant' .pipe'. Notez que (par défaut) '.pipe' ferme automatiquement le flux' response' par la suite. J'espère que c'est clair maintenant. N'hésitez pas à poser plus de questions si. :) – freakish