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
实例用于两个请求。
那么,怎么会呢?我该如何解决这个问题?
那是因为任何请求只能有一个响应。如果您注册了两个事件处理程序,第一个发送响应,这是预期的,第二个响应是意外的,这就是您收到该错误的原因。
考虑这段代码:
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
实例用于两个请求。
那么,怎么会呢?我该如何解决这个问题?
那是因为任何请求只能有一个响应。如果您注册了两个事件处理程序,第一个发送响应,这是预期的,第二个响应是意外的,这就是您收到该错误的原因。