NodeJS HTTPServer долго закрывается

Я работаю над приложением 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 с+), почему это может занять так много времени?


person connec    schedule 05.01.2012    source источник


Ответы (2)


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

сервер.закрыть()

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

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

person Linus Thiel    schedule 17.02.2012
comment
server.emit('close') вручную создает событие закрытия, которое немедленно закрывает сервер. stackoverflow.com/a/36830072/2893090. - person cs01; 21.05.2020

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

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

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