Error [ERR_STREAM_WRITE_AFTER_END]: write after end
28,353
You have already realized what the problem is. Let's take a look at this code:
http.createServer(function(req, res) {
if (req.url == '/funkcionalnosti-streznika') {
res.write(html1);
res.end();
}
if (req.url == '/posebnosti') {
res.write(html2)
res.end();
} else {
res.write('random');
res.end();
}
}).listen(8080)
Let's suppose that req.url
is '/funkcionalnosti-streznika'
. What happens? It enters the first if, writes html1
and ends res
. Then it is checked against '/posebnosti'
, but it's different, because the first if
was true. This means that the else
branch will be executed, so res.write('random');
is called, but res
was already closed in the first if
. Suggestion:
http.createServer(function(req, res) {
if (req.url == '/funkcionalnosti-streznika') {
res.write(html1);
res.end();
}
else if (req.url == '/posebnosti') {
res.write(html2)
res.end();
} else {
res.write('random');
res.end();
}
}).listen(8080)
![Admin](/assets/logo_square_200-5d0d61d6853298bd2a4fe063103715b4daf2819fc21225efa21dfb93e61952ea.png)
Author by
Admin
Updated on March 17, 2020Comments
-
Admin over 4 years
Code explanation: I am returning specific HTML file when user visit specific url:
const http = require('http'); const fs = require('fs'); fs.readFile('./funkcionalnosti-streznika.html', function(err1, html1) { fs.readFile('./posebnosti.html', function(err2, html2) { if (err1 || err2) { throw new Error(); } http.createServer(function(req, res) { if (req.url == '/funkcionalnosti-streznika') { res.write(html1); res.end(); } if (req.url == '/posebnosti') { res.write(html2) res.end(); } else { res.write('random'); res.end(); } }).listen(8080) }) });
on terminal I've got this error when I visit localhost:8080/funkcionalnosti-streznika:
events.js:288 throw er; // Unhandled 'error' event ^ Error [ERR_STREAM_WRITE_AFTER_END]: write after end at write_ (_http_outgoing.js:637:17) at ServerResponse.write (_http_outgoing.js:629:15) at Server.<anonymous> (/*filelocation*/:19:21) at Server.emit (events.js:311:20) at parserOnIncoming (_http_server.js:784:12) at HTTPParser.parserOnHeadersComplete (_http_common.js:119:17) Emitted 'error' event on ServerResponse instance at: at writeAfterEndNT (_http_outgoing.js:692:7) at processTicksAndRejections (internal/process/task_queues.js:85:21) { code: 'ERR_STREAM_WRITE_AFTER_END'
I think there is I problem when I close the response too early. How should I change this to be async?.
-
Marcus Castanho about 3 yearsI was taking a look at the documentation and I still don't understand: does the res.end() method only signals that the message is complete or does it actually ends the request? is there any other way of using it in the above example as you would with a "return" at the end of a if condition to ignore the other cases?
-
Lajos Arpad about 3 years@MarcusCastanho kindly read nodejs.org/api/… basically you end writing into the writable. In the code above you could remove all the
res.end()
lines and put them after the if-else if-else blocks, since it is called in all cases.return
assigns a value to a function and stops its execution. res.end signifies the end of the writing. You could doreturn res.end();
if that helps.