题 如何在Node.js中退出


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


1367
2018-03-10 21:30


起源




答案:


打电话给全球 process 对象 exit 方法:

process.exit()

来自文档:

process.exit([代码])

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

要使用“失败”代码退出:

process.exit(1);

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


1701
2018-03-10 21:36



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


来自官方 nodejs.org 文档:

process.exit(code)

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

要使用“失败”代码退出:

process.exit(1);

320
2018-03-22 18:48



@Alison是的,或更确切地说 code = 0; process.exit(code); - wprl
如果你要离开,你可能不关心它的价值 code? - Armand
@Alison一个更好的主意就是 process.exit() 没有参数,因为代码默认为0 - Jeremy - DeerAngel-org
@Armand你是对的 - 代码只是一个变量,在这种情况下用来表示参数是什么。所以.exit(0)做了示例所做的一切。 - Gerard ONeill
@Armand代码不适合你,它适用于运行代码的任何代码。例如,如果使用创建exit_0.js process.exit(0); 并运行它 node exit_0.js && echo 'success' 它会说“成功”。如果你创建exit_1.js process.exit(1); 并运行 node exit_1.js && echo 'success' 它不会说“成功”,因为你的进程退出非零(表示shell的“失败”或“异常退出”)。此外,您将看到不同的值 $? 如果你跑 node exit_1.js VS node exit_0.js (你可以通过做检查 node exit_1.js 然后做 echo $?)。 - msouth


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

  • 按Ctrl + C 两次,或
  • 类型 .exit 然后按Enter,或
  • 按Ctrl + d 在一行的开头(仅限Unix)

237
2018-06-02 13:02



请注意,除了Node之外,Mac或Linux上的Ctrl + D快捷键几乎适用于您将遇到的所有shell和REPL,包括像Bash这样的Unix shell,MySQL和PostgreSQL等数据库的shell,以及类似编程语言的REPL。 Python,PHP和Ruby。这是我用过的唯一一种退出炮弹的方法。 - Mark Amery
为了 node REPL,Ctrl + D退出是标准行为,因此它也适用于Windows。 - Alan


只是注意使用 process.exit([number]) 是 不建议 实践。

这是有问题的原因是因为写入process.stdout   Node.js是非阻塞的,可能发生在多个ticks上   Node.js事件循环。但是,调用process.exit()会强制执行   在对stdout进行额外写入之前退出的进程可以   执行。

而不是直接调用process.exit(),代码应该设置   process.exitCode并允许进程通过避免自然退出   为事件循环安排任何其他工作:

如果可以,您应该设置退出代码并允许节点正常退出:

process.exitCode = 1;

179
2017-07-06 05:52



到目前为止,这是最好的答案。其他答案可能不允许节点在退出前正确处理待处理事件,非常悲伤:( - djabraham
同意,这应该有更多的赞成!我有一个节点脚本通过shelljs.exec启动了多个子进程,如果任何子进程失败,我希望我的整个脚本返回错误退出代码。 process.exitCode = 1在exec回调中工作得很好(而在那里调用process.exit(1)会在所有子进程完成之前退出主脚本!) - Nick
我用这个答案发现我的过程从未真正退出。不得不ctrl-C它。 - jcollum
然后我会想象有什么东西让它保持开放 - 如果你这样做的话 echo "console.log('hello')" >> ./test.js && node test.js 你应该看到它打印你好然后退出 - Dominic Tobias
有许多用于立即处理和待处理事件终止的用例。这正是如此 process.exit() 是为了。 - Dominic Cerisano


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

$ node
> .exit
$

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

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


109
2017-10-29 16:51





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

重要的是要注意呼叫 process.exit() 将迫使   即使仍有,也要尽快退出   尚未完全完成的异步操作挂起,   包括I / O操作 process.stdout 和 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");
   });
});

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

案例3 - 内部错误

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


55
2018-02-06 17:38



惊人的回应。 Process.exit() 对于大多数应用程序而言,它看起我正在寻找相当于php的die()函数......更像是: throw new Error('die msg') - AvadData
如果有一堆代码应该连续执行直到收到关闭请求,那么注册事件是否有任何好的约定,这些事件将允许在响应关闭请求时放弃订阅,而不需要使用事件的代码或者请求关闭的代码对彼此有特定的了解?不幸的是,我能想到的唯一方法就是要求任何注册事件的代码片段都会创建一个包含一个用于取消注册它的闭包的包装器。 - supercat


REPL(命令行)

  • ctrl + c  两次

  • 类型 .exit 然后按Enter键

脚本文件

process.exit(code)

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

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

还有其他退出代码

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

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

9 - 参数无效

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


22
2018-02-09 05:36





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

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

12
2017-12-06 01:15



我想你想要的 process.exitCode - Julian de Bhal
为了记录:我花了很多时间试图获得 process.exitCode 在我正在构建的命令行工具中为我工作(在Node v4.3.0上测试)。但我无法让它按照记录的方式行事。这很好的可能是一个边缘情况 commander - 虽然 github.com/tj/commander.js/... 我好疑惑。不确定是否有其他人在那里看到了这个问题与节点4,但记录以防万一以供将来参考。 - mikermcneil
再次来自指挥官的可能性,我也看了它唯一的dep(github.com/zhiyelee/graceful-readlink/...)但没有骰子。只有可能的罪魁祸首似乎可能是: github.com/tj/commander.js/blob/...  具体来说,问题是即使你设置了 process.exitCode = 1,进程退出代码0。 - mikermcneil


从您可以使用的代码 process.exit([errorcode]) 哪里 [errorcode] 是一个可选的整数(0 是表示成功的默认值)。

如果你正在使用 读取Eval打印循环(REPL), 您可以使用 按Ctrl + d或者输入 .exit

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

在Mac上命令是 按Ctrl + ž按Ctrl + ž


6
2018-06-10 01:05



两个控制c也可以在mac上运行,至少在我的机器上运行 node --version  v0.10.18 - msouth