如何在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.stdout
和process.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 – 无效的参数
完整列表请参见节点退出代码
我有一个我想要的应用程序:
- 发送电子邮件给用户
- 以错误代码退出
我必须将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 + C , Ctrl + C
在Mac上,命令是Ctrl + Z , Ctrl + 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)