Рассмотрим этот код:
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
используется для обоих запросов.
Итак, почему? И как я могу это решить?
Это потому, что на любой запрос может быть только один ответ. Если вы регистрируете два обработчика событий, первый отправляет ответ, и это то, что ожидалось, второй ответ является неожиданным, и это причина, по которой вы получаете эту ошибку.