NodeJS HTTPServer долго закрывается - PullRequest
3 голосов
/ 06 января 2012

Я работаю над приложением Zappa и в настоящее время пытаюсь создать небольшой сценарий наблюдения, который останавливает сервер, очищает require.cache, затем повторно требует и перезапускает сервер при изменении файла, что-то вроде:

# watch all dependent files
for file of require.cache
  fs.watch file, ->
    # attach a handler to 'close'
    # -- here's the issue: this takes far too long to trigger
    server.on 'close', ->
      server = require './server'
      server.start()

      # log the new server's id
      console.log server.id

    # stop the current server instance
    server.stop()

    # clear require's cache
    delete require.cache[f] for f of require.cache

У меня также есть строка console.log server.id в моем обработчике запросов, чтобы я мог проверить, совпадают ли идентификаторы.

Итак, что происходит: когда я изменяю зависимость, сервер останавливается, запускается новый и регистрируется новый идентификатор, что все подливает. Однако в течение случайного промежутка времени запросы к серверу все еще регистрируют старый идентификатор, указывая, что старый прослушиватель все еще каким-то образом подключен. В конце концов, слушатель, кажется, «переключается», и новый идентификатор регистрируется.

Обновление: похоже, это связано с событием close (что неудивительно) - если я присоединяю простой console.log 'close' обратный вызов к событию close, идентификатор начинает меняться после 'close' появляется. Однако для запуска события close может потребоваться много времени (10 с +), почему это может занять так много времени?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Согласно документации node.js :

server.close ()

Запрещает серверу принимать новые подключения. См. Net.Server.close ().

Итак, ваш сервер перестанет принимать новые соединения, но на самом деле он не закроется (и не выдаст событие close), пока не закроются текущие соединения. Я предполагаю, что к вам подключены клиенты, возможно, с keep-alive запросами.

0 голосов
/ 16 марта 2017

Я искал ту же проблему.Чтобы дать вам и другим людям, которые ищут это решение:

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

app.use((req, res, next) => {
    res.setHeader('Connection', 'close');
    next();
});
...