ChatGPT解决这个技术问题 Extra ChatGPT

如何在 Node.js 中退出

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


8
8 revs, 6 users 50%

调用全局 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)。为什么?
S
Sergey Vyacheslavovich Brunov

注意,使用 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 程序开发代码流的最佳实践。
M
MiniGod

来自官方 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.jsnode exit_0.js,您将在 $? 中看到不同的值(您可以通过执行 node exit_1.js 然后执行 echo $? 来检查)。
M
Mark Amery

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

按 Ctrl + C 两次,或

键入 .exit 并按 Enter,或

在行首按 Ctrl + D(仅限 Unix)


请注意,除了 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 上!)
M
Mike M. Lin

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

$ node
> .exit
$

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

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


C
Community

这取决于您愿意退出 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 退出。
S
Siva Prakash

REPL(命令行)

按 ctrl + c 两次

输入 .exit 并按回车

脚本文件

process.exit(code)

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

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

还有其他退出代码,例如

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

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

- 无效参数

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


S
Stephen Quan

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

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

我必须将 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
作为记录:我花了一天的大部分时间试图让 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 退出。
H
HeadAndTail

Ctrl + C 两次或 .exit

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

M
MANN

正如@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 工具想要退出时不相关)?
D
Denis Lisitskiy

退出

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

z
zzzzBov

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

如果您使用 Read Eval Print Loop (REPL),您可以使用 Ctrl + D,或输入 .exit

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

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


两个控制 c 也可以在 mac 上工作,至少在我的 node --version v0.10.18
在 Mac 上,Control-C 似乎不会取消已经安排好的操作,而 ctrl-z 会毫不拖延地终止进程。
a
amir yeganeh

添加

process.exit(1);

会为你解决问题的


A
Alison Stuart

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


那是由于taskkill本身。您正在杀死进程本身。此外,一个 / 就足够了。
S
Shekar Mania

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

如果您想从代码中退出节点 js 应用程序,

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

process.exit从不优雅。省略代码只会使用 process.exitCode ?? 0
s
sumit_suthar

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

process.exit(code) process.kill(process.pid) process.abort()


I
Ishank

如果你想退出 node js 应用程序然后写

process.exit(1)

在你的代码中


用于指示应用程序中存在错误,其他答案已经澄清。
C
Community

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

显式调用 process.exit()。

或者,如果 nodejs 事件循环已完成所有任务,并且没有什么可做的。然后,节点应用程序将自动退出。

这个怎么运作?

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

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


R
Rmcr714
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

}

}

因此,如果我没有收到任何错误,我会在 db 和 try 块中填充一些集合,然后我们使用成功消息退出它,因此我们使用 process.exit() 参数中没有任何内容。如果出现错误,那么我们需要以不成功的消息退出,因此我们在参数中传递 1,例如 process.exit(1)。

额外:这里的退出是指退出典型的node js程序。例如,如果此代码位于名为 dbOperations.js 的文件中,则 process.exit 将退出并且不会运行 process.exit 之后的任何代码


F
F. Müller

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


O
Oleksii Trekhleb

您可以使用 process.exit([code]) 功能。

如果您想在没有“失败”的情况下退出,请使用代码 0

process.exit(0);

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

process.exit(1);

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


A
Albos Hajdari

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


这与考虑问题上下文无关。不是 Windows 进程,而是以编程方式退出节点函数中的给定执行
这与考虑问题上下文无关。不是 Windows 进程,而是以编程方式退出节点函数中的给定执行