Выход из узла.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); 

сейчас я не знаю (и я до сих пор не знаю!) как закрыть узел.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) Как мне закрыть узел.js изящно?

2) Как я могу восстановить беспорядок у меня создали?

5 69

5 ответов:

  1. использовать Ctrl+C чтобы выйти из процесса узла изящно

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

    например, в Unix: ps -ax | grep node даст вам запись типа:

    1039 ttys000    0:00.11 node index.js
    

    здесь index.js - это имя файла узла.

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

в настоящее время я использую систему событий узла для ответа на сигналы. Вот как я использую 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-подобной операционной системе, и программа узла, которую вы разместили в фоновом режиме, все еще была привязана к этому порту.

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

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

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

тип

process.exit()

или

.exit

на выходе node изящно.

удара управления + C дважды заставит выйти.

1) Как мне закрыть узел.js изящно?

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

Я написал свое собственное решение, чтобы обеспечить приложению изящное завершение работы и использование доменов:благодатное. Это стоит посмотреть.