如何在Node.js中退出

Bry*_*eld 1762 node.js

用于退出的命令是什么?(即终止Node.js进程)

Per*_* P. 2231

调用全局process对象的exit方法:

process.exit()
Run Code Online (Sandbox Code Playgroud)

来自文档:

process.exit([代码])

结束指定的过程code.如果省略,则退出使用"成功"代码0.

要使用"失败"代码退出:

process.exit(1);
Run Code Online (Sandbox Code Playgroud)

执行节点的shell应该将退出代码视为1.

  • @pixelfreak,`exit`根本没有误导性.您对Node的工作原理感到困惑.将Node视为服务器本身.它不仅仅是根据需要启动,就像PHP在像Apache这样的Web服务器中.Node甚至根本不需要与Web服务器有任何关系!它只是一些JavaScript的主机,有一些漂亮的内置库可用于执行有用的操作. (119认同)
  • 请注意,不推荐使用`process.exit()`**,如[下面的答案](/sf/answers/2631486861/)中所述. (32认同)
  • @Brad和PHP是一种通用语言.无需使用`mod_php`运行它或使用Apache.如果您真的想要或者像节点一样使用像FastCGI这样更健全/标准化的方法,您可以像PHP一样重新实现PHP中的httpd. (6认同)
  • 只想添加一些东西.如果您正在处理请求,那么您也应该'end()`请求.否则,它只会挂起. (3认同)

ali*_*ard 361

从官方nodejs.org文档:

process.exit(code)
Run Code Online (Sandbox Code Playgroud)

使用指定的代码结束进程.如果省略,则退出使用"成功"代码0.

要使用"失败"代码退出:

process.exit(1);
Run Code Online (Sandbox Code Playgroud)

  • @Armand代码不适合你,它适用于运行代码的任何代码.例如,如果使用`process.exit(0);`创建一个exit_0.js并使用`node exit_0.js && echo'adccess'`运行它,它将说"成功".如果你用`process.exit(1);`创建exit_1.js并运行`node exit_1.js && echo'eccess'`它就不会说"成功",因为你的进程退出非零(表示"失败"或"异常退出"到shell".另外,如果运行`node exit_1.js` vs'node exit_0.js`,你会在`$?`中看到不同的值(你可以通过`node exit_1.js`来检查然后做`echo $?`) . (22认同)
  • @Alison是的,或更确切地说`code = 0; process.exit(代码);` (9认同)
  • @Alison一个更好的想法是`process.exit()`没有参数,因为代码默认为0 (8认同)
  • 是否真的如果你要离开,你可能不关心`代码'的价值? (7认同)
  • @Armand你是对的 - 代码只是一个变量,在这种情况下用来表示参数是什么.所以.exit(0)做了示例所做的一切. (2认同)

Dom*_*nic 334

只是,用音符process.exit([number])不推荐的做法.

调用process.exit()将强制进程尽快退出,即使还有尚未完全完成的异步操作,包括对process.stdout和process.stderr的I/O操作.

在大多数情况下,实际上不必显式调用process.exit().如果事件循环中没有待处理的额外工作,Node.js进程将自行退出.process.exitCode属性可以设置为告诉进程在进程正常退出时使用哪个退出代码.

例如,以下示例说明了process.exit()方法的滥用,该方法可能导致打印到stdout的数据被截断和丢失:

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

这是有问题的原因是因为对Node.js中的process.stdout的写入有时是异步的,并且可能发生在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;
}
Run Code Online (Sandbox Code Playgroud)

  • 有许多用于立即处理和待处理事件终止的用例.这正是`process.exit()`的用途. (25认同)
  • 到目前为止,这是最好的答案.其他答案可能不允许节点在退出前正确处理待处理事件,非常悲伤:( (24认同)
  • 我用这个答案发现我的过程从未真正退出过.不得不ctrl-C它. (14认同)
  • 无论如何这都不是最好的答案,因为它不能回答问题。相反,它提供了有关如何为nodejs程序开发代码流的最佳实践。 (5认同)
  • 同意,这应该有更多的赞成!我有一个节点脚本通过shelljs.exec启动了多个子进程,如果任何子进程失败,我希望我的整个脚本返回错误退出代码.process.exitCode = 1在exec回调中工作得很好(而在那里调用process.exit(1)会在所有子进程完成之前退出主脚本!) (3认同)
  • 如果你 fork 一个子进程,你必须 `child.disconnect();` 让 `process.exitCode=0`(或 `1`)生效。不断开连接会导致您的程序挂起。https://nodejs.org/dist/latest-v6.x/docs/api/process.html#process_process_disconnect (2认同)
  • 因此,为什么答案以“只是一个音符”为前缀 (2认同)
  • 这表明我的快速服务器没有安全退出,并且可能使我免于追踪由于强制终止中间进程线程而导致截断数据的恼人问题。绝对在函数上使用它并安全地清理你的长寿命对象。花了大约 3 分钟来修复,谁知道截断数据问题需要多长时间才能让我意识到它为什么会发生。 (2认同)
  • 但是,如果您正在使用 async/await 并控制您的事件循环,如果您需要退出应用程序,此时您应该知道在下一个滴答中没有其他东西等待执行。例如,我同意在运行快递时使用它是不对的,但是如果您运行脚本,则完全可以用手正确地完成。关于快递,我确定有一种方法可以等待关闭套接字的信号,然后您就可以启动出口 (2认同)
  • 这个问题可能很多人不理解异步操作是如何工作的。他们启动一些东西,比如监听套接字,然后永远不会关闭它。他们使数据库连接保持打开状态。然后抱怨是“它没有关闭!” 所以我需要强迫它。基本上,如果您正在阅读本文,很可能您做错了什么。 (2认同)

Moh*_*sen 267

如果你在Unix终端或Windows命令行中想要退出Node REPL,要么......

  • Ctrl+ C两次,或
  • 键入.exit并按Enter,或
  • 在行的开头按Ctrl+ D(仅限Unix)

  • 请注意,除了Node之外,Mac或Linux上的Ctrl + D快捷键几乎适用于您将遇到的所有shell和REPL,包括像Bash这样的Unix shell,用于MySQL和PostgreSQL等数据库的shell,以及用于编程语言的REPL Python,PHP和Ruby.这是我用过的唯一退出炮弹的方法. (12认同)
  • 对于“节点” REPL,按Ctrl + D退出是一种标准行为,因此它也适用于Windows。 (2认同)

Mik*_*Lin 118

从命令行,.exit你想要的是:

$ node
> .exit
$
Run Code Online (Sandbox Code Playgroud)

它在REPL文档中有记录.REPL(Read-Eval-Print-Loop)是Node命令行的调用.

从正常程序,使用process.exit([code]).


teq*_*teq 72

这取决于您愿意退出node.js进程的原因,但无论如何process.exit()都是最后一个要考虑的选项.文件引用:

重要的是要注意,process.exit()即使还有尚未完全完成的异步操作,包括对process.stdout和的I/O操作,调用也会强制进程尽快退出process.stderr.

在大多数情况下,实际上没有必要process.exit()明确调用 .如果事件循环中没有待处理的额外工作,Node.js进程将自行退出.process.exitCode可以设置该 属性以告诉进程在进程正常退出时使用哪个退出代码.

让我们来说明您可能愿意退出node.js进程的原因以及为什么要避免process.exit():

案例1 - 执行完成(命令行脚本)

如果脚本已到达其末尾并且节点解释器未退出,则表示某些异步操作仍处于挂起状态.此时强制终止进程是错误的process.exit().最好是尝试理解让脚本以预期的方式退出的原因.当你解决这个问题时,你可以使用process.exitCode将任何结果返回给调用进程.

案例2 - 由于外部信号而终止(SIGINT/SIGTERM /其他)

例如,如果您愿意优雅地关闭快速应用程序.与命令行脚本不同,快速应用程序无限运行,等待新请求.process.exit()这将是一个糟糕的选择,因为它将中断所有正在管道中的请求.其中一些可能是非幂等的(UPDATE,DELETE).客户端永远不会知道这些请求是否在服务器端完成,这可能是客户端和服务器之间数据不一致的原因.唯一的好解决方案是告诉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");
   });
});
Run Code Online (Sandbox Code Playgroud)

如果它仍然没有退出 - 参见案例1.

案例3 - 内部错误

throw错误总是更好,您将获得格式良好的堆栈跟踪和错误消息.上层代码总是可以决定它们是否可以处理error(catch)或者让它崩溃.另一方面,process.exit(1)将默默地终止进程,并且没有机会从此恢复.它可能是唯一的"好处" process.exit(),您可以确定该过程将被终止.

  • 惊人的回应.`Process.exit()`看起来像大多数应用程序的主要过度杀伤.我正在寻找相当于php的die()函数......更像是:`throw new Error('die msg')` (4认同)

Siv*_*ash 25

REPL(命令行)

  • ctrl + c 两次

  • 键入.exit,然后按Enter

脚本文件

process.exit(code)
Run Code Online (Sandbox Code Playgroud)

当没有更多异步操作挂起时,节点通常以代码0退出.

process.exit(1) 应该用于退出失败代码.这将允许我们推断该节点没有正常关闭并被迫关闭.

还有其他退出代码

3 - 内部JavaScript解析错误(非常罕见)

5 - v8 javascript引擎中的致命错误

9 - 参数无效

有关完整列表,请参阅节点退出代码


Ste*_*uan 12

我有一个我想要的应用程序:

  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); });
Run Code Online (Sandbox Code Playgroud)

  • 我想你想要[process.exitCode](https://nodejs.org/api/process.html#process_process_exitcode) (4认同)

MAN*_*ANN 10

正如@Dominic指出的那样,抛出未被捕获的错误是更好的做法,而不是调用process.exit([code]):
process.exitCode = 1; throw new Error("my module xx condition failed");

  • 投掷的问题是糟糕的地狱堆栈痕迹.任何提示都要避免这种堆栈跟踪(如果使用不正确,CLI工具想退出时不相关)? (4认同)
  • 在"如何退出Node.js"问题的上下文中,这是一个可怕的建议.如果问题是专门询问如何退出错误,那么你的建议会更有意义.我强烈建议您以这样的方式表达您的回复,即表明用户按照您的建议行事,只有当他们在*错误*的情况下尝试退出应用程序时. (3认同)

Den*_*kiy 9

退出

let exitCode = 1;
process.exit(exitCode)
Run Code Online (Sandbox Code Playgroud)

有用的退出代码

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


Hea*_*ail 8

Ctrl + C两次或.exit.

> 
(To exit, press ^C again or type .exit)
> 
Run Code Online (Sandbox Code Playgroud)


zzz*_*Bov 7

从代码中可以使用process.exit([errorcode])where [errorcode]可选的整数(0默认值表示成功).

如果您正在使用读取评估打印循环(REPL),则可以使用Ctrl+ D或键入.exit

或者,在Windows或Linux上,您可以使用Ctrl+ C,Ctrl+C

在Mac上,命令是Ctrl+ Z,Ctrl+Z

  • 两个控件c也在mac上工作,至少在我的节点上有`node --version``v0.10.18` (2认同)