如何在Node.js中退出

什么是用于退出的命令?

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

 process.exit() 

从文档:

process.exit([代码])

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

以“失败”代码退出:

 process.exit(1); 

执行节点的shell应该看到退出代码为1。

从官方的nodejs.org文档:

 process.exit(code) 

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

以“失败”代码退出:

 process.exit(1); 

如果您在Unixterminal或Windows命令行中,并且想要退出节点REPL,则…

  • Ctrl + C两次,或
  • 键入.exit并按Enter,或
  • 在一行的开始处按Ctrl + D (仅适用于Unix)

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

 $ node > .exit $ 

它在REPL文档中有logging 。 REPL(Read-Eval-Print-Loop)是Node命令行的调用对象。

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

只是注意,使用process.exit([number]) 不build议练习。

这是有问题的原因是因为写入Node.js中的process.stdout是非阻塞的,并且可能发生在Node.js事件循环的多个tick上。 调用process.exit()会强制进程退出,然后可以执行额外的stdout写操作。

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

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

 process.exitCode = 1; 

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

请注意,调用process.exit()将尽可能快地强制进程退出,即使还有尚未完全完成的asynchronous操作,包括对process.stdoutprocess.stderr I / O操作。

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

让我们探讨为什么你可能愿意退出node.js进程,为什么你应该避免process.exit()

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

如果脚本已经到达终点,并且节点解释器不能退出,则表示有些asynchronous操作仍在等待处理。 在这一点上用process.exit()强制进程终止是错误的。 试着理解什么是阻止你的脚本以预期的方式退出 。 而当你解决这个问题时,你可以使用process.exitCode将任何结果返回给调用进程。

情况2 – 由于外部信号而终止(SIGINT / SIGTERM / other)

例如,如果您愿意优雅地closures快速应用程序。 与命令行脚本不同,快速应用程序无限运行,等待新的请求。 process.exit()在这里将是一个不好的select,因为它将中断正在pipe道中的所有请求。 其中一些可能是非幂等的(UPDATE,DELETE)。 客户端永远不会知道这些请求是否在服务器端完成,这可能是客户端和服务端数据不一致的原因。 唯一好的解决scheme是告诉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) 

当没有更多的asynchronous操作挂起时,节点通常以代码0退出。

应该使用process.exit(1)以失败代码退出。这将允许我们推断节点没有优雅地closures并被强制closures。

还有其他退出代码

3 – 内部JavaScriptparsing错误(非常非常罕见)

5 – 在V8 JavaScript引擎的致命错误

9 – 无效的参数

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

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

  1. 发送电子邮件给用户
  2. 以错误代码退出

我必须将process.exit(code)挂接到一个exit事件处理函数,否则,由于调用process.exit(code)直接抛出asynchronous事件,所以邮件将不会被发送。

 #!/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); }); 

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

如果您正在使用Read Eval Print Loop(REPL) ,则可以使用Ctrl + D或input.exit

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

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

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

退出

 let exitCode = 1; process.exit(exitCode) 

有用的退出代码

 1  - 一般错误的Catchall
 2  - 滥用shell buildins(根据Bash文档)
 126  - 调用的命令无法执行
 127  - “找不到命令”
 128  - 无效的参数退出
 128 + n  - 致命错误信号“n”
 130  - 由Control-C终止的脚本
 255 \ *  - 退出状态超出范围

如果你想退出节点js应用程序,那么在你的代码中写入process.exit(1)