打开端口后获取错误:错误[ERR\u STREAM\u WRITE\u after\u END]:WRITE after END(node.js)
我正在学习node.js,希望打开一个带有简单主页、关于和错误页面的服务器。我(似乎)严格遵循了语法,但每次我在浏览器中从服务器加载请求时,页面都会加载,但我在vsCode终端中收到一个错误,端口会关闭。这是我的密码:打开端口后获取错误:错误[ERR\u STREAM\u WRITE\u after\u END]:WRITE after END(node.js),node.js,server,Node.js,Server,我正在学习node.js,希望打开一个带有简单主页、关于和错误页面的服务器。我(似乎)严格遵循了语法,但每次我在浏览器中从服务器加载请求时,页面都会加载,但我在vsCode终端中收到一个错误,端口会关闭。这是我的密码: const http = require('http') const server = http.createServer((req, res)=>{ if(req.url ==='/'){ res.end('Home Page') } if(req.url =
const http = require('http')
const server = http.createServer((req, res)=>{
if(req.url ==='/'){
res.end('Home Page')
}
if(req.url ==='/about'){
res.end('about page')
}
res.end("error")
})
server.listen(5000, ()=>{
console.log("server is listening at port 5000...")
})
下面是我得到的错误:
server is listening at port 5000...
events.js:353
throw er; // Unhandled 'error' event
^
Error [ERR_STREAM_WRITE_AFTER_END]: write after end
at writeAfterEnd (_http_outgoing.js:694:15)
at ServerResponse.end (_http_outgoing.js:815:7)
at Server.<anonymous> (/home/nick/node-tutorial/app.js:11:5)
at Server.emit (events.js:376:20)
at parserOnIncoming (_http_server.js:896:12)
at HTTPParser.parserOnHeadersComplete (_http_common.js:126:17)
Emitted 'error' event on ServerResponse instance at:
at writeAfterEndNT (_http_outgoing.js:753:7)
at processTicksAndRejections (internal/process/task_queues.js:83:21) {
code: 'ERR_STREAM_WRITE_AFTER_END'
}
服务器正在端口5000侦听。。。
events.js:353
投掷者;//未处理的“错误”事件
^
错误[错误\u流\u结束后写入]:结束后写入
在writeAfterEnd(_http_outgoing.js:694:15)
在ServerResponse.end(_http_outgoing.js:815:7)
在服务器上。(/home/nick/node tutorial/app.js:11:5)
在Server.emit上(events.js:376:20)
在parserOnIncoming(_http_server.js:896:12)
在HTTPParser.parserOnHeadersComplete(_http_common.js:126:17)
在以下位置的ServerResponse实例上发出了“错误”事件:
在writeAfterEndNT(_http_outgoing.js:753:7)
在处理和拒绝时(内部/process/task_queues.js:83:21){
代码:'ERR\u STREAM\u WRITE\u AFTER\u END'
}
当您收到/
或/about
请求时,您将从请求处理程序调用res.end()
两次。你只能叫它一次
您会多次调用res.end()
,因为当您的请求与/
或/about
匹配时,您会为这些特定页面调用res.end()
,然后在同样执行的函数末尾会有另一个res.end()
要修复此问题,请更改为:
const server = http.createServer((req, res)=>{
if (req.url ==='/') {
res.end('Home Page')
} else if (req.url ==='/about') {
res.end('about page')
} else {
res.statusCode = 404;
res.end("error")
}
});
请记住,res.end()
不会阻止函数继续执行。因此,如果您不想在调用res.end()
后在函数中执行更多代码,您需要像上面那样使用条件保护它,或者在调用res.end(…)
后添加一个return
仅供参考,您的特定错误“ERR\u STREAM\u WRITE\u AFTER\u END”是因为
res.END()
将数据写入流,然后关闭流。因此,当您第二次尝试调用res.end()
时,它会尝试将数据写入一个已经关闭的流,这会给出您看到的错误。明白了。因此,为了澄清,是最后一个res.end(“错误”)
导致了错误的发生,对吗?也就是说,满足了其中一个“if”条件,因此它在那里调用了res.end(),然后在回调函数的末尾再次调用res.end()。@laleydecomote-是的,问题就是这样发生的。