Как выйти в Node.js - PullRequest
       64

Как выйти в Node.js

1652 голосов
/ 11 марта 2011

Какая команда используется для выхода?(т.е. завершить процесс Node.js)

Ответы [ 19 ]

2091 голосов
/ 11 марта 2011

Вызов глобального process объекта exit метод:

process.exit()

Из документов:

process.exit ([код])

Завершает процесс с указанным code. Если опущено, для выхода используется код «успеха» 0.

Для выхода с кодом «сбой»:

process.exit(1);

Оболочка, в которой выполнялся узел, должна видеть код выхода как 1.

355 голосов
/ 11 марта 2011

Из официальной nodejs.org документации:

process.exit(code)

Завершает процесс указанным кодом.Если опущено, для выхода используется код «успеха» 0.

Для выхода с кодом «сбоя»:

process.exit(1);
297 голосов
/ 02 июня 2016

Просто обратите внимание, что использование process.exit([number]) не рекомендуется практика.

Вызов process.exit () заставит процесс завершиться как можно быстрее, даже есливсе еще ожидают асинхронных операций, которые еще не завершены полностью, включая операции ввода-вывода для process.stdout и process.stderr.

В большинстве случаев на самом деле нет необходимости явно вызывать process.exit ().Процесс Node.js выйдет сам по себе, если в цикле обработки событий не ожидается дополнительная работа.Свойство process.exitCode может быть установлено, чтобы сообщить процессу, какой код завершения использовать при изящном завершении процесса.

Например, в следующем примере показано неправильное использование процесса. Exit () метод, который может привести к тому, что данные, напечатанные на стандартный вывод, будут усечены и потеряны:

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exit(1);
}

Причина, по которой это проблематично, заключается в том, что запись в process.stdout в Node.js иногда выполняется асинхронно и может происходить в течение нескольких тактовцикл событий Node.js.Однако вызов process.exit () вынуждает процесс завершиться до того, как эти дополнительные записи в stdout могут быть выполнены.

Вместо непосредственного вызова process.exit () код должен установить process.exitCode и разрешитьестественно завершить процесс, избегая планирования какой-либо дополнительной работы для цикла событий:

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();  
  process.exitCode = 1;
}
255 голосов
/ 22 марта 2012

Если вы находитесь в терминале Unix или в командной строке Windows и хотите выйти из узла REPL, либо ...

  • Нажмите Ctrl + C дважды, или
  • введите .exit и нажмите Enter, или
  • нажмите Ctrl + D в начале строки (Unixтолько)
116 голосов
/ 06 июля 2012

Из командной строки .exit - это то, что вы хотите:

$ node
> .exit
$

Это задокументировано в документах REPL . REPL (Read-Eval-Print-Loop) - это то, что называется командной строкой узла.

Из обычной программы используйте process.exit([code]).

68 голосов
/ 29 октября 2016

Это зависит от причины, по которой вы готовы выйти из процесса node.js, но в любом случае process.exit() является последним вариантом для рассмотрения . Цитата из документации:

Важно отметить, что вызов process.exit() вызовет процесс выхода как можно быстрее, даже если еще есть ожидающие асинхронные операции, которые еще не завершены полностью, включая операции ввода / вывода до process.stdout и process.stderr.

В большинстве случаев на самом деле нет необходимости звонить process.exit() явно. Процесс Node.js завершится самостоятельно если нет дополнительной работы, ожидающей в цикле событий. process.exitCode свойство может быть установлено, чтобы сообщить процессу, какой выход код, используемый при корректном завершении процесса.

Давайте рассмотрим возможные причины, по которым вы можете выйти из процесса node.js и почему вам следует избегать process.exit():

Случай 1 - Выполнение завершено (сценарий командной строки)

Если сценарий достиг своего конца и интерпретатор узла не завершился, это означает, что некоторые асинхронные операции все еще ожидают выполнения. На данном этапе неправильно принудительно завершать процесс с помощью process.exit(). Лучше попытаться понять , что удерживает ваш скрипт от ожидаемого выхода . И когда вы решите это, вы можете использовать process.exitCode, чтобы вернуть любой результат вызывающему процессу.

Случай 2 - Завершение из-за внешнего сигнала (SIGINT / SIGTERM / другое)

Например, если вы хотите аккуратно закрыть приложение express . В отличие от сценария командной строки, приложение Express продолжает работать бесконечно, ожидая новых запросов. process.exit() будет плохим вариантом, потому что он будет прерывать все запросы, находящиеся в конвейере. И некоторые из них могут быть неидемпотентными (ОБНОВЛЕНИЕ, УДАЛЕНИЕ). Клиент никогда не узнает, выполнены ли эти запросы на стороне сервера или нет, и это может быть причиной несоответствия данных между клиентом и сервером. Единственное хорошее решение - сообщить http-серверу прекратить прием новых запросов и дождаться, пока ожидающие завершат работу с server.close():

var express = require('express');
var app = express();
var server = app.listen(80);

process.on( 'SIGTERM', function () {
   server.close(function () {
     console.log("Finished all requests");
   });
});

Если он все еще не выходит - см. Случай 1.

Случай 3 - Внутренняя ошибка

Всегда лучше throw сообщать об ошибке, вы получите красиво отформатированную трассировку стека и сообщение об ошибке. Верхние уровни кода всегда могут решить, могут ли они обработать ошибку (catch) или позволить ей завершить процесс. С другой стороны, process.exit(1) прервет процесс молча, и у него не будет возможности восстановиться после этого. Это может быть единственным «преимуществом» process.exit(), вы можете быть уверены, что процесс будет остановлен.

24 голосов
/ 06 февраля 2017

REPL (командная строка)

  • Нажмите ctrl + c дважды

  • Введите .exit и нажмите enter

Файл сценария

process.exit(code)

Обычно узел завершается с кодом 0 , когда больше не выполняется асинхронных операций.

process.exit(1) следует использовать для выхода с кодом ошибки. Это позволит нам сделать вывод, что узел не закрылся изящно и был вынужден закрыться.

Есть и другие коды выхода, например

3 - Внутренняя ошибка синтаксического анализа JavaScript (очень-очень редко)

5 - Неустранимая ошибка в движке javascript v8

9 - неверный аргумент

Полный список см. коды выхода узла

12 голосов
/ 09 февраля 2015

У меня есть приложение, которое я хотел:

  1. Отправить электронное письмо пользователю
  2. Выход с кодом ошибки

Мне пришлось подключить process.exit(code) к обработчику событий exit, иначе письмо не будет отправлено, поскольку вызов process.exit(code) напрямую убивает асинхронные события.

#!/usr/bin/nodejs
var mailer = require('nodemailer');
var transport = mailer.createTransport();
mail = {
  to: 'Dave Bowman',
  from: 'HAL 9000',
  subject: 'Sorry Dave',
  html: 'Im sorry, Dave. Im afraid I cant do <B>THAT</B>.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });
9 голосов
/ 10 июня 2016

Как указывал @Dominic, выбрасывать необработанную ошибку лучше использовать вместо вызова process.exit ([code]) :
process.exitCode = 1; throw new Error("my module xx condition failed");

8 голосов
/ 05 мая 2018

Нажмите Ctrl + C дважды или .exit.

> 
(To exit, press ^C again or type .exit)
> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...