К сожалению, res.end()
напрямую не «гарантирует отключение сокета», потому что он должен учитывать HTTP Keep-Alive. Согласно документам, end
сообщает серверу, что все отправлено, и что ответ завершен. Объект сервера полностью зависит от того, следует ли немедленно отключиться.
Чтобы ответить на ваш вопрос более конкретно, важно, чтобы ответ выдал событие finish
. Если вы посмотрите на реализацию _finish()
, она просто генерирует событие.
Как вы уже заметили, он не всегда вызывает _finish()
напрямую ... но он сделал , установил this.finished = true
. Когда _flush()
выполняется, он отправляет все оставшиеся данные, а затем вызывает _finish()
.
Это довольно сложно, и я не думаю, что могу вдаваться в подробности без риска ошибиться.
Поскольку соединения иногда не закрываются, вы проверили, правильно ли настроен keep-alive
? Если HTTP-соединение установлено по умолчанию с keep-alive
, то вызов end
не закроет сокет.
Если ваша распечатка res.shouldKeepAlive
, она сообщит вам, если ваш сервер пытается использовать keep-alive
. Установите в false
в начале вашего обработчика запросов, если вы хотите, чтобы сервер не делал этого.