代码说明:当用户访问特定的URL时,我返回特定的HTML文件:
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)
})
});
在终端我已经得到了这个错误当我访问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'
我想当我过早地关闭响应时会有问题。我应该如何将其更改为异步?
4条答案
按热度按时间bttbmeg01#
你已经意识到问题所在了。让我们看一下这段代码:
假设
req.url
是'/funkcionalnosti-streznika'
,会发生什么?它进入第一个if,写html1
,结束res
。然后检查'/posebnosti'
,但它是不同的,因为第一个if
是真的。这意味着else
分支将被执行,所以res.write('random');
被调用,但是res
已经在第一个if
中关闭。建议:nkcskrwz2#
只要在每个if之后写return,这将停止代码的进一步执行。
ut6juiuv3#
您可以在API内部使用
if (res.writableEnded) return;
检查您的中间件是否已经写入响应流(它曾经是response.finished
,但现在已过时)xoefb8l84#
不要使用多个“if”条件,而要使用“if else”或只返回每个“if”条件。