Node.js 服务器请求对象在函数中定义时似乎没有被隔离

Node.js server request object seems not to be isolated when defined within a function

考虑这段代码:

const http = require("http")

const port = 8080

let myServer = http.createServer()
myServer.listen(port)

function serverSetOnFunctionAndDoRequest() {
  myServer.on("request",(req, res) => {
    res.writeHead(200)
    res.write("OK!")
    res.end()
  })
    
  http.get('http://localhost:' + port)
}

serverSetOnFunctionAndDoRequest()
serverSetOnFunctionAndDoRequest()
// Intentionally twice

我定义了一个服务器并向它发出了两个请求。这里的特殊之处在于 myServer.on("request" 事件处理函数设置在执行请求的函数中 (serverSetOnFunctionAndDoRequest)。 出于某种原因,这对我编写测试很方便。 我原以为每次我调用该函数时都会注册另一个事件处理程序回调,并且事情会被隔离。然而,恰恰相反的情况似乎发生了。我会得到 ERR_STREAM_WRITE_AFTER_END 如果我将 myServer.on("request" 放在 serverSetOnFunctionAndDoRequest 之外,则不会发生这种情况。我唯一的解释是相同的 res 实例用于两个请求。

那么,怎么会呢?我该如何解决这个问题?

那是因为任何请求只能有一个响应。如果您注册了两个事件处理程序,第一个发送响应,这是预期的,第二个响应是意外的,这就是您收到该错误的原因。