• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

在 Node.js 退出

武飞扬头像
HuntsBot
帮助1

问:

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

答1:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

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

process.exit()

From the docs:

process.exit([exitcode]) 以指定的代码结束进程。如果省略,则以“成功”代码 0 退出。要以“失败”代码退出: process.exit(1);执行节点的 shell 应该看到退出代码为 1。

只是想添加一些东西。如果您正在处理请求,则还应end()该请求。否则,它只会挂起。

@pixelfreak,exit 一点也不误导。您对 Node 的工作方式感到困惑。将 Node 视为服务器本身。它不只是根据需要启动,就像 PHP 在 Apache 之类的 Web 服务器中一样。 Node 甚至根本不需要与 Web 服务器有任何关系!它只是一些 JavaScript 的宿主,带有一些漂亮的内置库来做有用的事情。

@Brad PHP 是一种通用语言。无需使用 mod_php 运行它或使用 Apache。如果你真的想要的话,你可以像 node 一样在 PHP 中重新实现 httpd,或者像在 node 中一样使用更理智/标准化的方法,比如 FastCGI。

请注意,不推荐使用 process.exit(),如 this answer below 中所述。

稍微偏离主题,但我看到人们使用 process.exit(-1)。为什么?

答2:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

注意,使用 process.exit([number]) 是 not recommended 练习。

调用 process.exit() 将强制进程尽快退出,即使仍有尚未完全完成的异步操作挂起,包括对 process.stdout 和 process.stderr 的 I/O 操作。在大多数情况下,实际上没有必要显式调用 process.exit()。如果事件循环中没有其他待处理的工作,Node.js 进程将自行退出。可以设置 process.exitCode 属性来告诉进程在进程正常退出时使用哪个退出代码。例如,以下示例说明了 process.exit() 方法的误用,该方法可能导致打印到 stdout 的数据被截断和丢失: // 这是 not to do 的示例: if (someConditionNotMet()) { printUsageToStdout(); process.exit(1);这是有问题的原因是因为在 Node.js 中对 process.stdout 的写入有时是异步的,并且可能发生在 Node.js 事件循环的多个滴答声中。然而,调用 process.exit() 会强制进程在执行这些额外的对标准输出的写入之前退出。而不是直接调用 process.exit(),代码应该设置 process.exitCode 并允许进程自然退出,避免为事件循环安排任何额外的工作: // 如何正确设置退出代码,同时让 //进程优雅地退出。 if (someConditionNotMet()) { printUsageToStdout(); process.exitCode = 1; }

到目前为止,这是最好的答案。其他答案可能不允许节点在退出前正确处理未决事件,非常难过:(

同意,这应该有更多的赞成票!我有一个节点脚本,它通过 shelljs.exec 启动多个子进程,如果任何子进程失败,我希望我的整个脚本返回错误退出代码。 process.exitCode = 1 在 exec 回调中效果很好(而在其中简单地调用 process.exit(1) 会在所有子进程完成之前退出主脚本!)

我使用了这个答案,发现我的进程从未真正退出。只好按ctrl-C了。

立即处理和未决事件终止有许多用例。这正是 process.exit() 的用途。

这无论如何都不是最好的答案,因为它没有回答问题。相反,它提供了如何为 nodejs 程序开发代码流的最佳实践。

答3:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

来自官方 nodejs.org 文档:

process.exit(code)

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

使用“失败”代码退出:

process.exit(1);

@Alison 是的,或者更准确地说是code = 0; process.exit(code);

如果您要退出,您是否真的不在乎 code 的值?

@Alison 一个更好的主意就是 process.exit() 没有参数,因为代码默认为 0

@Armand您是对的-代码只是一个变量,在这种情况下用于指示参数是什么。所以 .exit(0) 做了这个例子所做的一切。

@Armand 代码不适合您,它适用于运行您的代码的任何内容。例如,如果您使用 process.exit(0); 创建一个 exit_0.js 并使用 node exit_0.js && echo 'success' 运行它,它将显示“成功”。如果您使用 process.exit(1); 创建 exit_1.js 并运行 node exit_1.js && echo 'success' 它不会说“成功”,因为您的进程以非零值退出(这表示 shell 的“失败”或“异常退出”)。此外,如果您运行 node exit_1.js 与 node exit_0.js,您将在 $? 中看到不同的值(您可以通过执行 node exit_1.js 然后执行 echo $? 来检查)。

答4:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

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

按 Ctrl C 两次,或

键入 .exit 并按 Enter,或

在行首按 Ctrl D(仅限 Unix)

huntsbot.com – 高效赚钱,自由工作

请注意,除了 Node 之外,Mac 或 Linux 上的 Ctrl D 快捷方式几乎可以在您遇到的所有 shell 和 REPL 上运行,包括 Bash 等 Unix shell、MySQL 和 PostgreSQL 等数据库的 shell,以及编程语言等的 REPL Python、PHP 和 Ruby。这是我用过的唯一退出 shell 的方法。

对于 node REPL,Ctrl D 退出是标准行为,因此它也适用于 Windows。

按 Ctrl C(即使在 Mac 上!)

答5:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

在命令行中,.exit 是您想要的:

$ node
> .exit
$

它记录在 REPL docs 中。 REPL(Read-Eval-Print-Loop)是 Node 命令行的名称。

在普通程序中,使用 process.exit([code])。

答6:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

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

需要注意的是,调用 process.exit() 将强制进程尽快退出,即使仍有未完全完成的异步操作挂起,包括对 process.stdout 和 process.stderr 的 I/O 操作.在大多数情况下,实际上没有必要显式调用 process.exit()。如果事件循环中没有其他待处理的工作,Node.js 进程将自行退出。可以设置 process.exitCode 属性来告诉进程在进程正常退出时使用哪个退出代码。

让我们讨论一下您可能愿意退出 node.js 进程的可能原因以及您应该避免使用 process.exit() 的原因:

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

如果脚本已经结束并且节点解释器没有退出,则表明一些异步操作仍在等待中。此时用 process.exit() 强制终止进程是错误的。最好尝试理解 what is holding your script from exiting in expected way。当您解决这个问题时,您可以使用 process.exitCode 将任何结果返回给调用进程。

案例 2 - 因外部信号而终止 (SIGINT/SIGTERM/other)

例如,如果您愿意优雅地关闭 express 应用。与命令行脚本不同,express 应用程序会无限运行,等待新的请求。 process.exit() 在这里不是一个好选择,因为它会中断所有正在处理的请求。其中一些可能是非幂等的(更新、删除)。客户端永远不会知道这些请求是否在服务器端完成,这可能是客户端和服务器之间数据不一致的原因。唯一好的解决方案是用 server.close() 告诉 http 服务器停止接受新请求并等待待处理的请求完成:

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() 的唯一“好处”,您可以确定该进程将被终止。

惊人的反应。 Process.exit() 对于大多数应用程序来说似乎是个大问题。我正在寻找一个等效于 php 的 die() 函数......更像:throw new Error('die msg')

如果一个人有一堆代码应该连续执行直到收到关闭请求,是否有任何好的约定来注册事件,允许订阅被放弃以响应关闭请求,而不需要使用事件的代码或者请求关闭的代码对彼此有特定的了解?不幸的是,我能想到的唯一个一个地种实现方式是要求任何注册事件的代码也创建一个包装器,其中包含一个用于取消注册它的闭包。

这应该是公认的答案。它解释了 process.exit()、process.exitCode、信号处理和(我想要的)throw new Error 退出。

答7:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

REPL(命令行)

按 ctrl c 两次

输入 .exit 并按回车

脚本文件

process.exit(code)

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

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

还有其他退出代码,例如

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

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

  • 无效参数

有关完整列表,请参阅 node exit codes

答8:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

向用户发送一封带有错误代码的电子邮件退出

我必须将 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 THAT.'
}
transport.sendMail(mail);
//process.exit(1);
process.on('exit', function() { process.exit(1); });

我想你想要process.exitCode

作为记录:我花了一天的大部分时间试图让 process.exitCode 在我正在构建的命令行工具中为我工作(在 Node v4.3.0 上测试)。但我无法让它表现得像记录的那样。这很可能是 commander 的一个极端情况——尽管 github.com/tj/commander.js/… 让我想知道。不确定是否有其他人在 Node 4 上看到过这个问题,但记录下来以备将来参考。

关于这来自指挥官的可能性,我还查看了它唯一的 dep (github.com/zhiyelee/graceful-readlink/…) 但没有骰子。唯一可能的罪魁祸首似乎是:github.com/tj/commander.js/blob/… 具体来说,问题在于,即使您设置了 process.exitCode = 1,进程也会以代码 0 退出。

答9:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

按 Ctrl C 两次或 .exit。

> 
(To exit, press ^C again or type .exit)
> 

答10:

huntsbot.com聚合了超过10 全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

正如@Dominic 指出的那样,throwing an uncaught error 是更好的做法,而不是调用 process.exit([code]): process.exitCode = 1; throw new Error(“my module xx condition failed”);

在“如何在 Node.js 中退出”问题的背景下,这是一个可怕的建议。如果问题专门询问如何退出错误,您的建议会更有意义。我强烈建议您以这样一种方式表达您的回复,以表明用户按照您的建议进行操作,只有当他们试图在出现错误时退出应用程序时。

@rstackhouse,我希望你已经抛出了一个未捕获的错误,它指向--> nodejs.org/api/process.html#process_process_exit_code

抛出的问题是丑陋的堆栈跟踪。避免此堆栈跟踪的任何提示(如果使用不正确,当 CLI 工具想要退出时不相关)?

答11:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

退出

let exitCode = 1;
process.exit(exitCode)

有用的退出代码

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

考虑更新您的答案,nodejs.org/api/process.html#process_process_exit_code

原文链接:https://www.huntsbot.com/qa/jWP9/how-to-exit-in-node-js?lang=zh_CN&from=csdn

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfickgf
系列文章
更多 icon
同类精品
更多 icon
继续加载