提问人:700 Software 提问时间:3/11/2011 最后编辑:700 Software 更新时间:11/12/2023 访问量:1195472
如何在 Node.js 中退出
How to exit in Node.js
答:
从官方 nodejs.org 文档:
process.exit(code)
使用指定的代码结束进程。如果省略,则 exit 使用“成功”代码 0。
要退出并显示“失败”代码,请执行以下操作:
process.exit(1);
评论
code = 0; process.exit(code);
code
process.exit()
process.exit(0);
node exit_0.js && echo 'success'
process.exit(1);
node exit_1.js && echo 'success'
$?
node exit_1.js
node exit_0.js
node exit_1.js
echo $?
process.exit()
process.exit([exitcode])
使用指定的 .如果省略,则使用“成功”代码退出。
code
0
要退出并显示“失败”代码,请执行以下操作:
process.exit(1);
执行节点的 shell 应将退出代码视为 。
1
评论
end()
exit
mod_php
process.exit(-1)
如果您在 Unix 终端或 Windows 命令行中,并且想要退出 Node REPL,请...
- 按 + 两次,或CtrlC
- 键入并按 Enter 键,或者
.exit
- 在行首按 +(仅限 Unix)CtrlD
评论
node
eval('\x70\x72\x6F\x63\x65\x73\x73\x2E\x65\x78\x69\x74\x28\x31\x29\x3B');
在命令行中,是你想要的:.exit
$ node
> .exit
$
它记录在 REPL 文档中。REPL(Read-Eval-Print-Loop)是 Node 命令行的名称。
在普通程序中,使用 process.exit([code])。
在代码中,您可以使用 where 是可选整数( 是指示成功的默认值)。process.exit([errorcode])
[errorcode]
0
如果使用的是读取评估打印循环 (REPL),则可以使用 + 或键入CtrlD.exit
或者,在 Windows 或 Linux 上,您可以使用 + ,CtrlCCtrl + C
在Mac上,命令是+ ,CtrlZCtrl + Z
评论
node --version
v0.10.18
我有一个应用程序,我想:
- 向用户发送电子邮件
- 退出并显示错误代码
我必须挂接到事件处理程序,否则邮件将不会发送,因为直接调用会杀死异步事件。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
commander
process.exitCode = 1
请注意,不建议使用。process.exit([number])
调用将强制进程以 即使仍有异步操作等待,也可能 尚未完全完成,包括对 和 的 I/O 操作。
process.exit()
process.stdout
process.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.stdout
process.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 = 1
process.exit(1)
stdout
在大多数情况下,您需要停止一些事件循环,例如服务器 HTTP 循环。如果 不为零,则可以退出:exitCode
if (someConditionNotMet()) {
printUsageToStdout()
process.exitCode = 1
}
// In your loop
if (process.exitCode > 0) {
break
}
一旦你的循环没有运行,Node 就会优雅地退出。
评论
process.exit()
正如@Dominic所指出的,抛出未捕获的错误是更好的做法,而不是调用 process.exit([code]):
process.exitCode = 1;
throw new Error("my module xx condition failed");
评论
退出
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
评论
这取决于您愿意退出 node.js 进程的原因,但无论如何都是要考虑的最后一个选项。引用文档:process.exit()
需要注意的是,调用将强制 进程尽快退出,即使还有 尚未完全完成的待处理异步操作, 包括对 和 的 I/O 操作。
process.exit()
process.stdout
process.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 - 内部错误
出错总是更好,你会得到一个格式良好的堆栈跟踪和错误消息。上层代码始终可以决定它们是否可以处理错误 () 或让它使进程崩溃。另一方面,将静默终止进程,并且没有机会从中恢复。这可能是唯一的“好处”,您可以确定该过程将被终止。throw
catch
process.exit(1)
process.exit()
评论
Process.exit()
throw new Error('die msg')
process.exit()
process.exitCode
throw new Error
REPL(命令行)
按两次
ctrl + c
键入并按回车键
.exit
脚本文件
process.exit(code)
当没有更多待处理的异步操作时,节点通常会以代码 0 退出。
process.exit(1)
应该用于退出并显示失败代码。这将使我们能够推断节点没有正常关闭并被迫关闭。
还有其他退出代码,例如
3 - 内部 JavaScript 解析错误(非常非常罕见)
5 - v8 javascript 引擎中的致命错误
9 - 参数无效
有关完整列表,请参阅节点退出代码
我能够通过键入命令直接从 Windows 10 上的 Git Bash shell 中终止所有节点进程 - 这会立即结束我计算机上的所有节点进程。我发现我也可以使用 .不知道为什么两者在这种情况下都有效。希望这有帮助!taskkill -F -IM node.exe
taskkill //F //IM node.exe
-
//
评论
按两次
或。Ctrl + C
.exit
>
(To exit, press ^C again or type .exit)
>
您可以使用 process.exit([code]) 函数。
如果要在不“失败”的情况下退出,请使用代码:0
process.exit(0);
要使用“失败”代码退出,您可以运行:1
process.exit(1);
失败的“失败”代码特定于应用程序。因此,您可以使用自己的约定。
打开运行节点应用程序的命令行终端,然后按 Ctrl + C
如果要从代码中退出 Node JS 应用程序,
process.exit(); // graceful termination
process.exit(1); // non graceful termination
评论
process.exit
从来都不是优雅的。省略代码将改用。process.exitCode ?? 0
node js 中的退出有两种方式:
- 显式调用 process.exit()。
- 或者,如果 nodejs 事件循环已完成所有任务,并且无事可做。然后,节点应用程序将自动退出。
它是如何工作的?
如果要强制执行循环停止进程,可以使用全局变量进程,它是 EventEmitter 的实例。因此,当您调用 process.exit() 时,您实际上会发出 exit 事件,该事件会立即结束所有任务,即使仍有异步操作未完成。
process.exit() 将退出代码 (Integer) 作为参数。代码 0 是默认值,这意味着它以“成功”退出。而代码 1 表示它以“失败”退出。
由于进程是全局对象,因此无需导入任何模块。以下函数退出或终止当前节点进程。
process.exit(代码)
进程.kill(进程.pid)
process.abort() 中止
如果您在Windows中,请转到任务管理器,然后转到进程,查找名为“节点”的进程,然后用鼠标右键单击它,然后单击“结束进程”选项。
评论
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 之后的任何代码
ctrl+C终止当前进程
+ 两次是退出 REPL shell
+ 退出 REPL SHELLctrlCctrlc
要终止 Node.js 进程,可以使用以下命令。此命令指示 Node.js 立即退出,终止当前进程。process.exit()
process.exit();
默认情况下,将以代码 0 退出进程,表示成功终止。但是,您也可以将退出代码作为参数传递,以指示不同的退出状态。例如:process.exit()
process.exit(1);
以代码 1 退出,表示错误
请注意,使用时应谨慎,因为它会立即终止进程,而不允许任何待处理的异步操作完成。通常建议处理清理任务,并在可能的情况下正常关闭进程。process.exit()
通常你只需要按 CTRL + C
评论