Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
打开端口后获取错误:错误[ERR\u STREAM\u WRITE\u after\u END]:WRITE after END(node.js)_Node.js_Server - Fatal编程技术网

打开端口后获取错误:错误[ERR\u STREAM\u WRITE\u after\u END]:WRITE after END(node.js)

打开端口后获取错误:错误[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 =

我正在学习node.js,希望打开一个带有简单主页、关于和错误页面的服务器。我(似乎)严格遵循了语法,但每次我在浏览器中从服务器加载请求时,页面都会加载,但我在vsCode终端中收到一个错误,端口会关闭。这是我的密码:

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-是的,问题就是这样发生的。