Node.js “écrire après la fin de” erreur
Starting off avec une base nœud de l'application, et je ne peux pas comprendre comment battre cette "écrire après la fin de" l'erreur, même avec les rappels proposé sur plusieurs sites.
index.js:
var server = require("./server");
var router = require("./router");
var requestHandlers = require("./requestHandlers");
var handle = {}
handle["/"] = requestHandlers.start;
handle["/start"] = requestHandlers.start;
handle["/upload"] = requestHandlers.upload;
server.start(router.route, handle);
server.js:
var http = require("http");
var url = require("url");
function start(route, handle) {
function onRequest(request, response) {
var postData ="";
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
route(handle, pathname, response);
}
http.createServer(onRequest).listen(8888);
console.log("Server has started.");
}
exports.start = start;
router.js:
function route(handle, pathname, response) {
console.log("About to route a request for " + pathname);
if (typeof handle[pathname] === 'function') {
handle[pathname](response);
}
else {
console.log("No request handler found for " + pathname);
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not found");
response.end();
}
}
exports.route = route;
and now the culprit, requestHandlers.js:
function start(response) {
console.log("Request handler 'start' was called.");
var body = '<html>'+
'<head>'+
'<meta http-equiv="Content-Type" content="text/html; '+
'charset=UTF-8" />'+
'</head>'+
'<body>'+
'<div>Hello Start</div>' +
'</body>'+
'</html>';
response.writeHead(200, {"Content-Type": "text/html"});
response.write(body);
response.end();
}
function upload(response) {
console.log("Request handler 'upload' was called");
response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Hello Upload");
response.end();
}
exports.start = start;
exports.upload = upload;
Et voici la trace de la pile:
C02RF8L7FVH5:HelloWorld francop$ node index.js
Serveur a démarré.
Demande d' /reçu.
Sur pour acheminer une demande d' /
Demande de gestionnaire de démarrage " a été appelé.
Sur pour acheminer une demande d' /
Demande de gestionnaire de démarrage " a été appelé.
les événements.js:141
jeter er; //non Gérée "erreur" de l'événement
^Erreur: écrire après la fin
au ServerResponse.OutgoingMessage.écrire (_http_outgoing.js:430:15)
à l'Objet.start (/Users/francop/Documents/Apps/HelloWorld/requestHandlers.js:18:14)
à la route (/Users/francop/Documents/Apps/HelloWorld/routeur.js:5:21)
au IncomingMessage. (/Users/francop/Documents/Apps/HelloWorld/serveur.js:19:6)
au emitNone (événements.js:67:13)
au IncomingMessage.émettre (événements.js:166:7)
au endReadableNT (_stream_readable.js:921:12)
au nextTickCallbackWith2Args (nœud.js:442:9)
au processus._tickCallback (nœud.js:356:17)
Les seules réponses que j'ai trouvé n'importe où ont été "Il est asynchrone, donc utiliser un callback":
response.write(body, function(err) {
response.end();
});
...Ce qui déclenche exactement la même erreur.
L'aide de cette serait étonnant. Les quelques éparses réponses que j'ai trouvé en ligne n'aide pas du tout.
Merci!
OriginalL'auteur sir_dancealot | 2016-09-01
Vous devez vous connecter pour publier un commentaire.
Retour de votre corps dans
response.end()
au lieu deresponse.write()
Edit 1:
La première fois
response.write()
est appelé, il va envoyer le tampon informations d'en-tête et le premier corps pour le client. La deuxième foisresponse.write()
est appelée, Node.js suppose que vous allez être données en continu, et les envoie séparément. Qui est, la réponse est mis en mémoire tampon jusqu'à la première partie de corps.Donc, si vous voulez d'envoyer un seul morceau, vous devez utiliser
response.end(body)
, et si vous voulez envoyer plusieurs morceaux vous devez mettre fin à vous appelle avec laresponse.end()
après plusieursresponse.write()
.Exemple seul morceau:
Exemple de plusieurs morceaux:
Veuillez voir
Edit #1
.OriginalL'auteur David Antoon
Ceci est un exemple de "Le Nœud Débutant"
J'ai reposté les fichiers ci-dessous parce que du temps de ce post, il n'y a pas de séparation sur votre poste entre "router.js" et "requestHanders.js".
Je rencontre le même problème quand j'ai couru ce nœud v8 fonctionne actuellement avec l'incident nœud v9.5.0. Je ne suis pas présenter cela comme une solution pour le problème viens de le dire, il a travaillé pour moi. C'était peut-être un problème résolu dans la version mise à jour je ne peux pas dire pour sûr.
Aussi votre flux d'erreur indique "requestHandlers.js:18:14" vous pourriez obtenir de meilleurs résultats si vous confirmez ce que la ligne 18 est sur votre code (dans le futur). Sans espaces de la ligne 18 est la ligne avant la déclaration de la fonction de téléchargement. Alors qu'en fait, cette erreur a été déclenchée par la "réponse.fin();"
index.js
router.js
server.js
requestHandlers.js
OriginalL'auteur Jason Smart