Выход из node.js изящно

Я читаю отличную онлайн-книгу http://nodebeginner.org/ и пробую простой код

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888); 

Теперь я не знал (и я до сих пор не знаю!), как изящно закрыть node.js, поэтому я просто пошел ctrl+z. Теперь каждый раз, когда я пытаюсь запустить node server.js, я получаю следующие сообщения об ошибках.

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
Error: EADDRINUSE, Address already in use
    at Server._doListen (net.js:1100:5)
    at net.js:1071:14
    at Object.lookup (dns.js:153:45)
    at Server.listen (net.js:1065:20)
    at Object.<anonymous> (/Users/Bob/server.js:7:4)
    at Module._compile (module.js:402:26)
    at Object..js (module.js:408:10)
    at Module.load (module.js:334:31)
    at Function._load (module.js:293:12)
    at Array.<anonymous> (module.js:421:10)

Итак, два вопроса:

1) Как отключить node.js изящно?

2) Как восстановить беспорядок, который я создал?

Ответ 1

  • Используйте Ctrl + C, чтобы закончить процесс node

  • Чтобы очистить беспорядок, зависит от вашей платформы, но в основном вам нужно найти остатки процесса, в котором работает node, и убить его.

    Например, в Unix: ps -ax | grep node вы получите следующую запись:

    1039 ttys000    0:00.11 node index.js
    

    где index.js - это имя вашего файла node.

    В этом примере 1039 - это идентификатор процесса (ваш будет другим), поэтому kill -9 1039 закончит его, и вы сможете снова привязываться к порту.

Ответ 2

В настоящее время я использую систему событий Node для ответа на сигналы. Здесь, как я использую сигнал Ctrl-C (SIGINT) в программе:

process.on( 'SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit( );
})

Вы получили ошибку "Адрес в использовании", потому что Ctrl-Z не убивает программу; он просто приостанавливает процесс в UNIX-подобной операционной системе, и программа Node, которую вы разместили в фоновом режиме, все еще привязана к этому порту.

В Unix-подобных системах [Control + Z] является наиболее распространенной клавиатурой по умолчанию отображение последовательности ключей, которая приостанавливает процесс (SIGTSTP). [3] При вводе пользователем на своем компьютерном терминале в настоящее время для запуска процесса переднего плана отправляется сигнал SIGTSTP, который обычно заставляет процесс приостановить его выполнение. Пользователь может позже продолжите выполнение процесса, набрав команду 'fg' (сокращение для переднем плане) или набрав 'bg' (сокращение от фона) и, кроме того, набрав команду "disown", чтобы отделить фоновый процесс от терминал 1

Вам нужно будет убить ваши процессы, выполнив kill <pid> или 'killall -9 node' или тому подобное.

Ответ 3

Поскольку node.js - это среда исполнения, управляемая событиями, самый изящный выход - исчерпать очередь ожидающих событий. Когда очередь событий пуста, процесс завершится. Вы можете гарантировать, что очередь событий разряжена, выполняя такие действия, как очистка заданных интервалов времени и закрытие любых серверов с помощью открытых соединений сокетов. Это становится сложнее при использовании сторонних модулей, потому что вы во власти того, что автор модуля позаботился о том, чтобы изящно уничтожить ожидающие события, которые он создал. Это может быть не самый практичный способ выйти из процесса node.js, так как вы потратите много усилий на отслеживание "пропущенных" ожидающих событий, но это самый изящный, я думаю.

Ответ 4

Введите

process.exit()

или

.exit

чтобы выйти из node изящно.

Нажатие Control + C дважды приведет к выходу.

Ответ 5

1) Как отключить node.js изящно?

Прослушивание сигнала SIGINT. В Windows вам необходимо прослушать ctrl-c с модулем readline.

Я написал собственное решение, чтобы предоставить приложение грациозное завершение работы и использование доменов: grace. Стоит посмотреть.