Как выйти в 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 - неверный аргумент

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

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

  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); });

Как отметил @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

добавление

      process.exit(1);

сделаю трюк за тебя

Я смог заставить все процессы моего узла умереть непосредственно из оболочки 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

Обычно вам просто нужно нажать CTRL + C

Чтобы завершить процесс Node.js, вы можете использовать команду. Эта команда инструктирует Node.js немедленно выйти, завершив текущий процесс.

process.exit();

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

Выход с кодом 1, указывающим на ошибку.

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

в режиме REPL (Read Evaluate Print Loop, используя только node ключевое слово, не указывая на файл) вы можете выйти, выполнив команду .exit :

      $ node
> .exit

вот живой пример:

Вы можете использовать функцию process.exit([code]).

Если вы хотите выйти без "сбоя", вы используете код 0:

process.exit(0);

Чтобы выйти с кодом "сбой" 1 вы можете запустить:

process.exit(1);

Код сбоя является специфическим для приложения. Таким образом, вы можете использовать свои собственные соглашения для этого.

Если вы работаете в Windows, перейдите в Диспетчер задач, затем перейдите в раздел "Процессы", найдите процесс под названием "узел", затем щелкните его правой кнопкой мыши и затем выберите параметр "Завершить процесс".

Другие вопросы по тегам