Answers:
process.exit()
process.exit([code])
以指定的结束进程
code
。如果省略,则退出使用“成功”代码0
。要以“失败”代码退出:
process.exit(1);
执行节点的外壳程序应将退出代码视为
1
。
exit
完全没有误导。您对Node的工作方式感到困惑。将Node视为服务器本身。它不仅仅是根据需要启动的,就像PHP在Apache之类的Web服务器中一样。Node甚至根本不需要与Web服务器有任何关系!它只是一些JavaScript的宿主,还有一些漂亮的内置库可用来做有用的事情。
mod_php
Apache 一起运行或使用它。如果您确实想要或可以像在node中那样使用更合理/标准化的方法(如FastCGI),则可以像在node中那样重新实现PHP中的httpd。
process.exit()
是不建议,如在下面这个答案。
只是一个音符,使用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); }
之所以有问题,是因为有时Node.js中对process.stdout的写入是异步的,并且可能在Node.js事件循环的多个滴答中发生。但是,调用process.exit()会强制该进程退出,然后再执行对stdout的其他写入操作。
该代码应该直接设置process.exitCode,而不是直接调用process.exit(),并通过避免为事件循环安排任何其他工作来允许进程自然退出:
// How to properly set the exit code while letting // the process exit gracefully. if (someConditionNotMet()) { printUsageToStdout(); process.exitCode = 1; }
process.exit()
目的。
code = 0; process.exit(code);
code
?
process.exit()
没有参数,因为代码默认为0
process.exit(0);
并运行它,node exit_0.js && echo 'success'
它将显示“成功”。如果使用创建process.exit(1);
并运行exit_1.js,node exit_1.js && echo 'success'
它不会说“成功”,因为您的进程以非零值退出(这表示shell出现“失败”或“异常退出”)。另外,$?
如果运行node exit_1.js
vs ,您将看到不同的值node exit_0.js
(可以先检查node exit_1.js
再做echo $?
)。
如果您在Unix终端或Windows命令行中,并且想要退出Node REPL,请选择...
.exit
并按Enter,或node
REPL,按Ctrl + D退出是一种标准行为,因此它也适用于Windows。
在命令行中,.exit
您需要的是:
$ node
> .exit
$
它记录在REPL docs中。REPL(Read-Eval-Print-Loop)是所谓的Node命令行。
在普通程序中,使用process.exit([code])
。
这取决于您愿意退出node.js进程的原因,但是无论如何,这process.exit()
是要考虑的最后一个选择。来自文档的报价:
重要的是要注意,
process.exit()
即使仍有尚未完成的异步操作(包括到process.stdout
和的I / O操作),调用也会迫使进程尽快退出process.stderr
。在大多数情况下,实际上没有必要
process.exit()
显式调用 。如果事件循环中没有其他待处理的工作,则Node.js进程将自行退出。process.exitCode
可以设置该 属性,以告知进程正常退出时要使用哪个退出代码。
让我们介绍一下您可能愿意退出node.js进程以及为什么应该避免的可能原因 process.exit()
:
如果脚本已结束,并且节点解释器没有退出,则表明某些异步操作仍在等待处理。此时强行终止进程是错误的process.exit()
。最好尝试了解阻止脚本以预期方式退出的原因。而当您解决此问题时,可以process.exitCode
用来将任何结果返回给调用过程。
例如,如果您愿意正常关闭Express应用程序。与命令行脚本不同,Express App保持无限运行,等待新请求。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。
throw
出错总是比较好,您将获得格式正确的堆栈跟踪和错误消息。较高级别的代码始终可以决定是否可以处理错误(catch
)或使其崩溃。另一方面,process.exit(1)
它将以静默方式终止进程,并且没有机会从中恢复。它可能是的唯一“好处” process.exit()
,您可以确定该过程将终止。
Process.exit()
对于大多数应用程序来说,这看起来像是大材小用。我一直在寻找与php的die()函数等效的函数……更像是:throw new Error('die msg')
REPL(命令行)
按ctrl + c
两次
键入.exit
,然后按Enter
脚本文件
process.exit(code)
节点通常以代码0退出当没有其他异步操作挂起时,。
process.exit(1)
应该使用失败代码退出。这将允许我们推断该节点未正常关闭,而被迫关闭。
还有其他退出代码,例如
3-内部JavaScript解析错误(非常罕见)
5-v8 JavaScript引擎中的致命错误
9-无效的参数
有关完整列表,请参见节点退出代码
我有一个想要的应用程序:
我必须挂接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); });
process.exitCode
自己正在构建的命令行工具(在Node v4.3.0上进行测试)为我工作。但是我无法让它表现得像文献记载的那样。commander
尽管github.com/tj/commander.js/…让我感到奇怪,但这种情况本来可以算是一个边缘案例。不知道是否还有其他人在节点4上遇到了此问题,但是为了以防万一,以备将来参考。
process.exitCode = 1
,该过程
正如@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内置函数(根据Bash文档) 126-调用的命令无法执行 127-“找不到命令” 128-无效的参数退出 128 + n-致命错误信号“ n” 130-脚本被Control-C终止 255 \ *-退出状态超出范围
从代码中,您可以使用process.exit([errorcode])
where [errorcode]
是可选整数(0
默认值表示成功)。
如果使用的是“ 读取Eval打印循环(REPL)”,则可以使用Ctrl+ D或键入.exit
另外,在Windows或Linux上,您可以使用Ctrl+ C,Ctrl+C
在Mac上,命令为Ctrl+ Z,Ctrl+Z
node --version
v0.10.18
通过键入,我能够使我的所有节点进程直接从Windows 10的Git Bash shell中消失taskkill -F -IM node.exe
-这一次结束了我计算机上的所有节点进程。我发现我也可以使用taskkill //F //IM node.exe
。不知道为什么都-
和//
工作在这方面。希望这可以帮助!
由于流程是全局对象,因此无需导入任何模块。以下函数退出或终止当前节点进程。
process.exit(代码)
process.kill(process.pid)
process.abort()
如果您使用的是Windows,请转至“任务管理器”,然后转至“进程”,查找一个名为“节点”的进程,然后用鼠标右键单击该进程,然后单击“结束进程”选项。
您可以使用process.exit([code])函数。
如果要退出而不会出现“失败”,请使用代码0
:
process.exit(0);
要以“失败”代码退出,1
您可以运行:
process.exit(1);
失败的“失败”代码特定于应用程序。因此,您可以使用自己的约定。
end()
。否则,它将挂起。