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.
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
@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