Как выйти в Node.js
Какая команда используется для выхода? (т.е. прекратить процесс Node.js)
26 ответов
Позвоните в глобальный process
объекты exit
метод:
process.exit()
process.exit ([код])
Завершает процесс с указанным
code
, Если опущено, выход использует код успеха0
,Чтобы выйти с кодом "сбой":
process.exit(1);
Оболочка, которая выполнила узел, должна видеть код выхода как 1.
Просто обратите внимание, что с помощью process.exit([number])
не рекомендуется практика
Причина, по которой это проблематично, заключается в том, что записи в 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; }
Из официальной документации https://nodejs.org/api/:
process.exit(code)
Завершает процесс указанным кодом. Если опущен, выход использует код "успеха" 0.
Чтобы выйти с кодом "сбой":
process.exit(1);
Если вы находитесь в терминале Unix или в командной строке Windows и хотите выйти из узла REPL, либо...
- Нажмите Ctrl + C дважды или
- тип
.exit
и нажмите Enter, или - нажмите Ctrl + D в начале строки (только для Unix)
Из командной строки .exit
это то, что вы хотите:
$ node
> .exit
$
Это задокументировано в документах REPL. REPL (Read-Eval-Print-Loop) - это то, что называется командной строкой узла.
Из обычной программы используйте process.exit([code])
,
Это зависит от причины, по которой вы готовы выйти из процесса 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()
, вы можете быть уверены, что процесс будет прекращен.
REPL(командная строка)
Нажмите
ctrl + c
дваждыТип
.exit
и нажмите ввод
Файл сценария
process.exit(code)
Обычно узел завершается с кодом 0, когда больше не ожидают асинхронные операции.
process.exit(1)
должен использоваться для выхода с кодом ошибки. Это позволит нам сделать вывод, что узел не закрылся изящно и был вынужден закрыться.
Есть другие коды выхода, такие как
3 - Внутренняя ошибка синтаксического анализа JavaScript (очень очень редко)
5 - фатальная ошибка в движке JavaScript v8
9 - неверный аргумент
Полный список см. В кодах выхода узла.
У меня есть приложение, которое я хотел:
- Отправить электронное письмо пользователю
- Выход с кодом ошибки
Я должен был зацепить 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); });
Как отметил @Dominic, выбрасывать неперехваченную ошибку лучше, чем вызывать process.exit ([code]):process.exitCode = 1;
throw new Error("my module xx condition failed");
Нажмите Ctrl + C
дважды или .exit
,
>
(To exit, press ^C again or type .exit)
>
Выходить
let exitCode = 1;
process.exit(exitCode)
Полезные коды выхода
1 - Catchall для общих ошибок 2 - Неправильное использование встроенных командных оболочек (согласно документации Bash) 126 - вызванная команда не может быть выполнена 127 - "команда не найдена" 128 - Неверный аргумент для выхода 128+n - сигнал фатальной ошибки "n" 130 - Сценарий прекращен с помощью Control-C 255\* - выход из состояния вне диапазона
Из кода вы можете использовать process.exit([errorcode])
где [errorcode]
необязательное целое число (0
по умолчанию указывает на успех).
Если вы используете Read Eval Print Loop (REPL), вы можете использовать Ctrl + D или набрать .exit
Кроме того, в Windows или Linux вы можете использовать Ctrl + C, Ctrl + C
На Mac команда это Ctrl + Z, Ctrl + Z
Я смог заставить все процессы моего узла умереть непосредственно из оболочки Git Bash в Windows 10, набрав taskkill -F -IM node.exe
- это завершает все процессы узла на моем компьютере одновременно. Я нашел, что я мог бы также использовать taskkill //F //IM node.exe
, Не уверен, почему оба -
а также //
работать в этом контексте. Надеюсь это поможет!
Командная строка
Нажмите CTRL + C дважды
ИЛИ ЖЕ
Тип .exit
и нажмите ввод
Файл сценария
process.exit(code)
Поскольку процесс является глобальным объектом, вам не нужно импортировать какой-либо модуль. Следующая функция завершает или убивает текущий процесс узла.
process.exit (код)
process.kill (process.pid)
process.abort ()
Откройте терминал командной строки, где запущено приложение узла, и нажмите Ctrl + C
если вы хотите выйти из приложения js узла из кода,
process.exit(); // graceful termination
process.exit(1); // non graceful termination
Выход в узел js выполняется двумя способами:
- Вызов process.exit() явно.
- Или, если цикл событий node js выполнен со всеми задачами, и ничего не остается сделать. Затем приложение узла автоматически завершит работу.
Как это устроено?
Если вы хотите заставить цикл выполнения остановить процесс, вы можете использовать глобальную переменную process, которая является экземпляром EventEmitter. Поэтому, когда вы вызываете process.exit(), вы фактически генерируете событие выхода, которое немедленно завершает все задачи, даже если асинхронные операции еще не выполнены.
process.exit() принимает код выхода (Integer) в качестве параметра. Код 0 является значением по умолчанию, и это означает, что он завершается с "успехом". В то время как код 1 означает, что он завершается с ошибкой.
Если вы хотите выйти из приложения js узла, напишите
process.exit(1)
в вашем коде
import mongosse from 'mongoose'
import dotenv from 'dotenv'
import colors from 'colors'
import users from './data/users.js'
import products from './data/products.js'
import User from './models/userModel.js'
import Product from './models/productModel.js'
import Order from './models/orderModel.js'
import connectDB from './config/db.js'
dotenv.config()
connectDB()
const importData = async()=>{
try{
await Order.deleteMany()
await Product.deleteMany()
await User.deleteMany()
const createdUsers = await User.insertMany(users)
const adiminUser = createdUsers[0]._id
sampleProducts = products.map(product =>{
return {...product, user:adiminUser }
})
await Product.insertMany(sampleProducts)
console.log('Data Imported!'.green.inverse)
process.exit() //success and exit
}catch(error){
consolele.log(`${error}`.red.inverse)
process.exit(1) //error and exit
}
}
поэтому здесь я заполняю некоторые коллекции в базе данных и в блоке try, если я не получаю никаких ошибок, мы выходим из него с сообщением об успехе, поэтому для этого мы используем process.exit() без ничего в параметре. Если есть ошибка, нам нужно выйти с сообщением об ошибке, поэтому мы передаем 1 в параметр, подобный этому, process.exit(1).
Дополнительно: здесь под выходом мы подразумеваем выход из типичной программы node js. например, если этот код был в файле с именем dbOperations.js, то process.exit завершится и не будет запускать любой код, который следует после process.exit
ctrl+Cзавершить текущий процесс
ctrl+ Cдважды - выйти из оболочки REPL
ctrl+ cвыйти из REPL SHELL
Чтобы завершить процесс Node.js, вы можете использовать команду. Эта команда инструктирует Node.js немедленно выйти, завершив текущий процесс.
process.exit();
По умолчанию процесс завершается с кодом 0, что указывает на успешное завершение. Однако вы также можете передать код выхода в качестве аргумента, чтобы указать различные статусы выхода. Например:
Обратите внимание, что использование
в режиме REPL (Read Evaluate Print Loop, используя только
node
ключевое слово, не указывая на файл) вы можете выйти, выполнив команду
.exit
:
$ node
> .exit
вот живой пример:
Вы можете использовать функцию process.exit([code]).
Если вы хотите выйти без "сбоя", вы используете код 0
:
process.exit(0);
Чтобы выйти с кодом "сбой" 1
вы можете запустить:
process.exit(1);
Код сбоя является специфическим для приложения. Таким образом, вы можете использовать свои собственные соглашения для этого.
Если вы работаете в Windows, перейдите в Диспетчер задач, затем перейдите в раздел "Процессы", найдите процесс под названием "узел", затем щелкните его правой кнопкой мыши и затем выберите параметр "Завершить процесс".