Como sair no Node.js
(11)
A partir da documentação oficial do nodejs.org :
process.exit(code)
Termina o processo com o código especificado. Se omitido, exit usa o código de 'sucesso' 0.
Para sair com um código de 'falha':
process.exit(1);
Qual é o comando usado para sair? (ou seja, terminar o processo do Node.js)
Apenas uma nota que usando process.exit([number])
exit é prática exit .
A razão pela qual isso é problemático é porque as gravações em process.stdout em Node.js são algumas vezes assíncronas e podem ocorrer em vários ticks do loop de eventos Node.js. Chamar process.exit (), no entanto, força o processo a sair antes que as gravações adicionais em stdout possam ser executadas.
Em vez de chamar process.exit () diretamente, o código deve definir o process.exitCode e permitir que o processo saia naturalmente evitando o planejamento de qualquer trabalho adicional para o loop de eventos:
// How to properly set the exit code while letting // the process exit gracefully. if (someConditionNotMet()) { printUsageToStdout(); process.exitCode = 1; }
Depende do motivo pelo qual você está disposto a sair do processo node.js, mas, em qualquer caso, process.exit()
é a última opção a ser considerada . Uma citação da documentação:
É importante observar que chamar
process.exit()
forçará o processo a sair o mais rápido possível, mesmo se ainda houver operações assíncronas pendentes que ainda não foram totalmente concluídas, incluindo operações de E / S paraprocess.stdout
eprocess.stderr
.Na maioria das situações, não é realmente necessário chamar
process.exit()
explicitamente. O processo Node.js sairá por conta própria se não houver trabalho adicional pendente no loop de eventos. A propriedadeprocess.exitCode
pode ser definida para informar ao processo qual código de saída usar quando o processo sair normalmente.
Vamos cobrir possíveis razões pelas quais você pode estar disposto a sair do processo node.js e por que você deve evitar process.exit()
:
Caso 1 - Execução concluída (script de linha de comando)
Se o script chegou ao fim e o intérprete de nó não sai, isso indica que algumas operações assíncronas ainda estão pendentes. Está errado forçar a finalização do processo com process.exit()
neste momento. É melhor tentar entender o que está impedindo o seu script de sair da maneira esperada . E quando você resolver isso, você pode usar process.exitCode
para retornar qualquer resultado para o processo de chamada.
Caso 2 - Rescisão por causa de sinal externo (SIGINT / SIGTERM / other)
Por exemplo, se você estiver disposto a desativar um aplicativo expresso com facilidade. Ao contrário do script de linha de comando, o aplicativo expresso continua funcionando infinitamente, aguardando novas solicitações. process.exit()
será uma opção ruim aqui porque vai interromper todos os pedidos que estão no pipeline. E alguns deles podem não ser idempotentes (UPDATE, DELETE). O cliente nunca saberá se essas solicitações estão concluídas ou não no lado do servidor e pode ser o motivo da inconsistência de dados entre o cliente e o servidor. A única boa solução é dizer ao servidor http para parar de aceitar novos pedidos e esperar que os pendentes terminem com 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");
});
});
Se ainda não sair, veja o caso 1.
Caso 3 - erro interno
É sempre melhor throw
um erro, você obterá uma mensagem de erro e rastreamento de pilha bem formatado. Os níveis superiores de código sempre podem decidir se podem manipular erros ( catch
) ou deixar que o processo seja interrompido. Por outro lado, process.exit(1)
terminará o processo silenciosamente e não haverá chance de se recuperar disso. Pode ser o único “benefício” de process.exit()
, você pode ter certeza de que o processo será finalizado.
Do código você pode usar process.exit([errorcode])
onde [errorcode]
é um inteiro opcional ( 0
é o padrão para indicar sucesso).
Se você estiver usando o Read Eval Print Loop (REPL) , você pode usar Ctrl + D ou digitar .exit
Alternativamente, no Windows ou Linux, você pode usar Ctrl + C , Ctrl + C
No Mac, o comando é Ctrl + Z , Ctrl + Z
Eu tenho um aplicativo que eu queria:
- Envie um email para o usuário
- Sair com um código de erro
Eu tive que ligar process.exit(code)
para um manipulador de eventos de exit
, ou então o e-mail não será enviado desde que process.exit(code)
diretamente mata eventos assíncronos.
#!/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); });
Na linha de comando, .exit
é o que você deseja:
$ node
> .exit
$
Está documentado nos documentos REPL . REPL (Read-Eval-Print-Loop) é o que a linha de comando do nó é chamada.
De um programa normal, use process.exit([code])
.
Sair
let exitCode = 1;
process.exit(exitCode)
Códigos de Saída Úteis
1 - Catchall for general errors 2 - Misuse of shell builtins (according to Bash documentation) 126 - Command invoked cannot execute 127 - “command not found” 128 - Invalid argument to exit 128+n - Fatal error signal “n” 130 - Script terminated by Control-C 255\* - Exit status out of range
Se você está em um terminal Unix ou na linha de comando do Windows e deseja sair do Node REPL, também ...
- Pressione Ctrl + C duas vezes ou
- digite
.exit
e pressione Enter, ou - pressione Ctrl + D no início de uma linha (somente Unix)
se você quiser sair do aplicativo do nó js, então escreva
process.exit(1)
no seu código
Linha de comando
Pressione CTRL + C duas vezes
OU
Digite .exit
e pressione enter
Arquivo de script
process.exit(code)