如何在 Node.js 中退出

How to exit in Node.js

提问人:700 Software 提问时间:3/11/2011 最后编辑:700 Software 更新时间:11/12/2023 访问量:1195472

问:

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

节点.js

评论

2赞 Lelo 11/19/2020
这里有一个操作方法:nodejs.dev/learn/how-to-exit-from-a-nodejs-program

答:

404赞 alienhard 3/11/2011 #1

从官方 nodejs.org 文档:

process.exit(code)

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

要退出并显示“失败”代码,请执行以下操作:

process.exit(1);

评论

11赞 wprl 2/22/2013
@Alison是的,或者更准确地说code = 0; process.exit(code);
7赞 Armand 2/22/2013
如果你退出,你可能不在乎的价值,这是真的吗?code
10赞 Jeremy Moritz 3/29/2014
@Alison 一个更好的主意是没有参数,因为代码默认为 0process.exit()
2赞 Gerard ONeill 6/8/2014
@Armand 你是对的 -- 代码只是一个变量,在本例中用于指示参数是什么。所以 .exit(0) 会执行示例执行的所有操作。
28赞 msouth 8/23/2014
@Armand代码不适合你,但它适用于运行代码的任何内容。例如,如果您创建一个exit_0.js并使用它运行它,则会显示“成功”。如果您使用并运行exit_1.js它不会说“成功”,因为您的进程以非零(表示 shell 的“失败”或“异常退出”)退出。此外,如果您运行 vs,您将看到不同的值(您可以通过 do 然后 doing 来检查)。process.exit(0);node exit_0.js && echo 'success'process.exit(1);node exit_1.js && echo 'success'$?node exit_1.jsnode exit_0.jsnode exit_1.jsecho $?
2838赞 8 revs, 6 users 50%Pero P. #2

调用全局进程对象的 exit 方法:

process.exit()

从文档中:

process.exit([exitcode])

使用指定的 .如果省略,则使用“成功”代码退出。code0

要退出并显示“失败”代码,请执行以下操作:

process.exit(1);

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

评论

8赞 pixelfreak 3/4/2012
只是想添加一些东西。如果您正在处理请求,您也应该处理该请求。否则,它只会挂起。end()
142赞 Brad 9/20/2012
@pixelfreak,一点也不具有误导性。您对 Node 的工作原理感到困惑。将 Node 视为服务器本身。它不是根据需要启动的,就像PHP在Apache这样的Web服务器中一样。Node 甚至与 Web 服务器完全无关!它只是一些 JavaScript 的主机,带有一些漂亮的内置库来做有用的事情。exit
7赞 binki 8/8/2016
@Brad PHP 是一种通用语言。无需使用Apache运行它或使用Apache。如果你真的想要,你可以像 node 一样在 PHP 中重新实现 httpd,或者使用更理智/标准化的方法,比如 FastCGI,就像你在 node 中一样。mod_php
58赞 AndreasPizsa 12/8/2017
请注意,不建议这样做,如下面的答案所述。process.exit()
0赞 PiggyPlex 1/23/2021
有点跑题了,但我看到有人用.这是为什么呢?process.exit(-1)
295赞 Mohsen 3/23/2012 #3

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

  • 按 + 两次,或CtrlC
  • 键入并按 Enter 键,或者.exit
  • 在行首按 +(仅限 Unix)CtrlD

评论

16赞 Mark Amery 5/24/2015
请注意,除了 Node 之外,Mac 或 Linux 上的 Ctrl+D 快捷键几乎适用于您遇到的所有 shell 和 REPL,包括 Bash 等 Unix shell、MySQL 和 PostgreSQL 等数据库的 shell,以及 Python、PHP 和 Ruby 等编程语言的 REPL。这是我用过的唯一退出 shell 的方法。
2赞 Alan 12/31/2017
对于 REPL,Ctrl+D 退出是一种标准行为,因此它也适用于 Windows。node
0赞 Prince 10/1/2019
按 Ctrl + C(即使在 Mac 上!
0赞 Szczerski 6/3/2023
对于那些不喜欢走捷径的人eval('\x70\x72\x6F\x63\x65\x73\x73\x2E\x65\x78\x69\x74\x28\x31\x29\x3B');
135赞 Mike M. Lin 7/6/2012 #4

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

$ node
> .exit
$

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

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

8赞 zzzzBov 12/6/2013 #5

在代码中,您可以使用 where 是可选整数( 是指示成功的默认值)。process.exit([errorcode])[errorcode]0

如果使用的是读取评估打印循环 (REPL),则可以使用 + 或键入CtrlD.exit

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

在Mac上,命令是+ ,CtrlZCtrl + Z

评论

2赞 msouth 8/23/2014
两个控制 c 也适用于 mac,至少在我的node --version v0.10.18
0赞 jorisw 12/24/2019
在 Mac 上,Control-C 似乎不会取消已经安排好的操作,而 ctrl-z 会立即终止该进程。
15赞 Stephen Quan 2/9/2015 #6

我有一个应用程序,我想:

  1. 向用户发送电子邮件
  2. 退出并显示错误代码

我必须挂接到事件处理程序,否则邮件将不会发送,因为直接调用会杀死异步事件。process.exit(code)exitprocess.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); });

评论

4赞 Julian de Bhal 2/26/2016
我想你想要process.exitCode
0赞 mikermcneil 8/27/2016
郑重声明:我花了一天的大部分时间试图在我正在构建的命令行工具(在 Node v4.3.0 上测试)中为我工作。但我无法让它按照记录的方式运行。这很可能是一个边缘案例——尽管 github.com/tj/commander.js/......让我想知道。不确定是否有其他人在节点 4 上看到过这个问题,但记录下来以备将来参考。process.exitCodecommander
0赞 mikermcneil 8/27/2016
关于这来自指挥官的可能性,我还查看了它唯一的 dep(github.com/zhiyelee/graceful-readlink/...),但没有骰子。唯一可能的罪魁祸首似乎是:github.com/tj/commander.js/blob/......具体来说,问题在于,即使您设置了 ,进程也会以代码 0 退出。process.exitCode = 1
633赞 Dominic 6/2/2016 #7

请注意不建议使用。process.exit([number])

调用将强制进程以 即使仍有异步操作等待,也可能 尚未完全完成,包括对 和 的 I/O 操作。process.exit()process.stdoutprocess.stderr

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

例如,以下示例说明了该方法的误用,该方法可能导致数据打印到 截断和丢失:process.exit()stdout

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout()
  process.exit(1)
}

原因是 有问题的是因为在 Node.js 中写入 有时是异步的,并且可能发生在 Node.js 事件循环。但是,调用会强制 在那些额外的写入之前退出的进程可以 执行。process.stdoutprocess.exit()stdout

代码不应直接调用,而应通过避免 为事件循环安排任何其他工作:process.exit()process.exitCode

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout()  
  process.exitCode = 1
}

顶级域名

设置退出代码(非零表示错误),例如 而不是强制进程终止,这可能会导致异步代码不正常终止(例如,您可能会错过)。process.exitCode = 1process.exit(1)stdout

在大多数情况下,您需要停止一些事件循环,例如服务器 HTTP 循环。如果 不为零,则可以退出:exitCode

if (someConditionNotMet()) {
  printUsageToStdout()
  process.exitCode = 1
}

// In your loop
if (process.exitCode > 0) {
  break
}

一旦你的循环没有运行,Node 就会优雅地退出。

评论

53赞 djabraham 10/26/2016
到目前为止,这是最好的答案。其他答案可能不允许节点在退出前正确处理待处理事件,非常可悲:(
6赞 Nick B 11/23/2016
同意,这应该有更多的赞成票!我有一个节点脚本,它通过shelljs.exec启动了多个子进程,如果任何子进程失败,我希望我的整个脚本返回错误退出代码。process.exitCode = 1 在 exec 回调中效果很好(而简单地调用 process.exit(1) 会在所有子进程完成之前退出主脚本!
22赞 jcollum 1/27/2017
我使用了这个答案,发现我的进程从未真正退出过。必须 ctrl-C 它。
67赞 Dominic Cerisano 1/2/2018
即时处理和待处理事件终止有许多用例。这正是它的意图。process.exit()
21赞 fIwJlxSzApHEZIl 1/9/2018
无论如何,这都不是最好的答案,因为它没有回答问题。相反,它提供了有关如何为 nodejs 程序开发代码流的最佳实践。
13赞 MANN 6/10/2016 #8

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

评论

4赞 rstackhouse 8/2/2016
在“如何在 Node.js 中退出”这个问题的背景下,这是一个可怕的建议。如果问题专门询问如何在错误时退出,您的建议会更有意义。我强烈建议您以表明用户按照您的建议行事的方式表达您的回复,只有当他们尝试在发生错误时退出应用程序时。
0赞 MANN 8/2/2016
@rstackhouse,我希望你已经抛出了一个未捕获的错误,该错误指向 --> nodejs.org/api/process.html#process_process_exit_code
5赞 MoOx 9/5/2016
投掷的问题是丑陋的堆栈痕迹。任何避免此堆栈跟踪的提示(如果使用不正确,则 CLI 工具想要退出时不相关)?
11赞 Denis Lisitskiy 10/27/2016 #9

退出

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

评论

0赞 Cmag 9/14/2017
考虑更新您的答案,nodejs.org/api/process.html#process_process_exit_code
101赞 teq 10/30/2016 #10

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

需要注意的是,调用将强制 进程尽快退出,即使还有 尚未完全完成的待处理异步操作, 包括对 和 的 I/O 操作。process.exit()process.stdoutprocess.stderr

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

让我们介绍一下您可能愿意退出 node.js 进程的可能原因以及为什么您应该避免:process.exit()

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

如果脚本已结束,并且节点解释器未退出,则表示某些异步操作仍处于挂起状态。此时强制终止进程是错误的。最好尝试了解是什么阻碍了脚本以预期的方式退出。当你解决这个问题时,你可以使用将任何结果返回给调用进程。process.exit()process.exitCode

案例 2 - 由于外部信号(SIGINT/SIGTERM/其他)而终止

例如,如果您愿意正常关闭快速应用。与命令行脚本不同,express 应用程序无限运行,等待新请求。 在这里将是一个糟糕的选择,因为它会中断管道中的所有请求。其中一些可能是非幂等的(UPDATE、DELETE)。客户端永远不会知道这些请求是否在服务器端完成,这可能是客户端和服务器之间数据不一致的原因。唯一好的解决方案是告诉 http 服务器停止接受新请求并等待待处理的请求完成:process.exit()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 - 内部错误

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

评论

5赞 AvadData 5/12/2017
惊人的反应。 对于大多数应用程序来说,这似乎是严重的矫枉过正。我一直在寻找一个等效于 php 的 die() 函数......更像:Process.exit()throw new Error('die msg')
0赞 supercat 3/30/2018
如果有一堆代码应该连续执行,直到收到关闭请求,那么是否有任何好的约定来注册事件,允许在响应关闭请求时放弃订阅,而不需要使用事件的代码或请求关闭的代码具有彼此的特定知识?不幸的是,我能想到的唯一实现方法是要求任何注册事件的代码段也创建一个包装器,其中包含一个闭包来取消注册它。
1赞 dturvene 6/26/2020
这应该是公认的答案。它解释了 、 、 信号处理和(我想要什么)退出。process.exit()process.exitCodethrow new Error
32赞 Siva Prakash 2/7/2017 #11

REPL(命令行)

  • 两次ctrl + c

  • 键入并按回车键.exit

脚本文件

process.exit(code)

当没有更多待处理的异步操作时,节点通常会以代码 0 退出。

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

还有其他退出代码,例如

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

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

9 - 参数无效

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

3赞 Alison Stuart 12/19/2017 #12

我能够通过键入命令直接从 Windows 10 上的 Git Bash shell 中终止所有节点进程 - 这会立即结束我计算机上的所有节点进程。我发现我也可以使用 .不知道为什么两者在这种情况下都有效。希望这有帮助!taskkill -F -IM node.exetaskkill //F //IM node.exe-//

评论

2赞 Paul Stelian 12/23/2019
这是由于任务杀戮本身。你正在扼杀进程本身。此外,单个 / 就足够了。
12赞 HeadAndTail 5/5/2018 #13

按两次 或。Ctrl + C.exit

> 
(To exit, press ^C again or type .exit)
> 
0赞 Oleksii Trekhleb 9/20/2018 #14

您可以使用 process.exit([code]) 函数。

如果要在不“失败”的情况下退出,请使用代码:0

process.exit(0);

要使用“失败”代码退出,您可以运行:1

process.exit(1);

失败的“失败”代码特定于应用程序。因此,您可以使用自己的约定。

3赞 Shekar Mania 3/30/2019 #15

打开运行节点应用程序的命令行终端,然后按 Ctrl + C

如果要从代码中退出 Node JS 应用程序,

process.exit(); // graceful termination 
process.exit(1); // non graceful termination 

评论

1赞 CherryDT 9/23/2021
process.exit从来都不是优雅的。省略代码将改用。process.exitCode ?? 0
1赞 majid jiji 5/7/2019 #16

node js 中的退出有两种方式:

  • 显式调用 process.exit()。
  • 或者,如果 nodejs 事件循环已完成所有任务,并且无事可做。然后,节点应用程序将自动退出。

它是如何工作的?

如果要强制执行循环停止进程,可以使用全局变量进程,它是 EventEmitter 的实例。因此,当您调用 process.exit() 时,您实际上会发出 exit 事件,该事件会立即结束所有任务,即使仍有异步操作未完成。

process.exit() 将退出代码 (Integer) 作为参数。代码 0 是默认值,这意味着它以“成功”退出。而代码 1 表示它以“失败”退出。

3赞 sumit_suthar 7/11/2019 #17

由于进程是全局对象,因此无需导入任何模块。以下函数退出或终止当前节点进程。

process.exit(代码)

进程.kill(进程.pid)

process.abort() 中止

-4赞 Albos Hajdari 3/1/2020 #18

如果您在Windows中,请转到任务管理器,然后转到进程,查找名为“节点”的进程,然后用鼠标右键单击它,然后单击“结束进程”选项。

评论

0赞 Felix Orinda 5/17/2022
这与考虑问题背景无关。不是 Windows 进程,而是以编程方式退出节点函数中的给定执行
0赞 Felix Orinda 5/17/2022
这与考虑问题背景无关。不是 Windows 进程,而是以编程方式退出节点函数中的给定执行
1赞 Rmcr714 11/28/2020 #19
import mongosse from 'mongoose'
import dotenv from 'dotenv'
import colors from 'colors'
import users from './data/users.js'
import products from './data/products.js'
import User from './models/userModel.js'
import Product from './models/productModel.js'
import Order from './models/orderModel.js'
import connectDB from './config/db.js'

dotenv.config()

connectDB()

const importData = async()=>{
try{
    await Order.deleteMany()
    await Product.deleteMany()
    await User.deleteMany()

    const createdUsers = await User.insertMany(users)
    const adiminUser = createdUsers[0]._id

    sampleProducts = products.map(product =>{
        return {...product, user:adiminUser }
    })
    await Product.insertMany(sampleProducts)

    console.log('Data Imported!'.green.inverse)
    process.exit()      //success and exit

}catch(error){
    consolele.log(`${error}`.red.inverse)
    process.exit(1)   //error and exit

}

}

所以在这里,我在数据库和 try 块中填充一些集合,如果我没有收到任何错误,那么我们退出它并显示一条成功消息,因此我们使用 process.exit() 参数中没有任何内容。 如果出现错误,那么我们需要退出并显示一条不成功的消息,因此我们在参数中传递 1,如下所示 , process.exit(1)。

extra:这里通过退出,我们的意思是退出那个典型的节点 js 程序。例如,如果此代码位于名为 dbOperations.js 的文件中,则 process.exit 将退出,并且不会运行在 process.exit 之后的任何代码

1赞 Selvaraj 10/2/2021 #20

ctrl+C终止当前进程
+ 两次是退出 REPL shell
+ 退出 REPL SHELL
ctrlCctrlc

0赞 Ravi Kumar Sharma 6/10/2023 #21

要终止 Node.js 进程,可以使用以下命令。此命令指示 Node.js 立即退出,终止当前进程。process.exit()

process.exit();

默认情况下,将以代码 0 退出进程,表示成功终止。但是,您也可以将退出代码作为参数传递,以指示不同的退出状态。例如:process.exit()

process.exit(1);以代码 1 退出,表示错误

请注意,使用时应谨慎,因为它会立即终止进程,而不允许任何待处理的异步操作完成。通常建议处理清理任务,并在可能的情况下正常关闭进程。process.exit()

1赞 technumbers 11/12/2023 #22

通常你只需要按 CTRL + C