#javascript #node.js #callback #webserver #isolation
#javascript #node.js #обратный вызов #веб-сервер #изоляция
Вопрос:
Рассмотрим этот код:
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
экземпляр используется для обоих запросов.
Итак, как же так? И как я могу решить эту проблему?
Ответ №1:
Это потому, что любой запрос может иметь только один ответ. Если вы регистрируете два обработчика событий, первый отправляет ответ, и это то, что ожидалось, второй ответ неожиданный, и это причина, по которой вы получаете эту ошибку.