Node.js объект запроса сервера, по-видимому, не изолирован, когда он определен внутри функции

#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:

Это потому, что любой запрос может иметь только один ответ. Если вы регистрируете два обработчика событий, первый отправляет ответ, и это то, что ожидалось, второй ответ неожиданный, и это причина, по которой вы получаете эту ошибку.