用于退出的命令是什么?(即终止Node.js进程)
从nodejs.org官方文档中:
process.exit(code)
使用指定的代码结束进程。如果省略,退出将使用“成功”代码0。
要退出并显示“失败”代码:
process.exit(1);
调用全局进程对象的退出方法:
process.exit()
从文档中:
process.ext([exitcode])使用指定的代码结束进程。如果省略,则退出并返回“成功”代码0。要退出并显示“失败”代码:进程.退出(1);执行节点的shell应该看到退出代码为1。
如果您在Unix终端或Windows命令行中,并希望退出节点REPL,请选择。。。
按Ctrl+C两次,或键入.ext并按Enter键,或在行开头按Ctrl+D(仅限Unix)
在命令行中,.ext是您想要的:
$ node
> .exit
$
它记录在REPL文档中。REPL(Read Eval Print Loop)是Node命令行的名称。
在正常程序中,使用process.ext([code])。
从代码中,您可以使用process.ext([errorcode]),其中[errorcode]是可选整数(0是表示成功的默认值)。
如果使用的是Read-Eval打印循环(REPL),则可以使用Ctrl+D或键入.ext
或者,在Windows或Linux上,可以使用Ctrl+C、Ctrl+C
在Mac上,命令为Ctrl+Z,Ctrl+Z
我有一个应用程序,我想:
向用户发送电子邮件退出并返回错误代码
我必须将process.ext(代码)挂接到退出事件处理程序,否则邮件将不会被发送,因为调用process.ext(代码)直接杀死异步事件。
#!/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.ext([number])。
调用process.exit()将强制进程尽快退出即使仍有异步操作等待尚未完全完成,包括I/O操作process.stdout和process.stderr。在大多数情况下,实际上不需要调用process.exit()显式。如果出现以下情况,Node.js进程将自行退出在事件循环中没有附加的工作待定。这个process.exitCode属性可以设置为告诉进程哪个退出当进程正常退出时使用的代码。例如,以下示例说明了process.exit()方法,可能导致打印到stdout的数据截断和丢失://这是一个*不*做什么的例子:if(someConditionNotMet()){打印用途到标准输出();进程.退出(1);}原因是问题是因为在Node.js中写入process.stdout有时是异步的,可能会在Node.js事件循环。然而,调用process.exit()会强制在向stdout进行额外写入之前退出的进程执行。代码应该设置process.exitCode,并通过避免调度事件循环的任何附加工作://如何正确设置退出代码//进程优雅地退出。if(someConditionNotMet()){打印用途到标准输出();process.exitCode=1;}
正如@Dominic所指出的,抛出未捕获的错误是更好的做法,而不是调用process.ext([code]):process.exitCode=1;抛出新错误(“我的模块xx条件失败”);
退出
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()是最后要考虑的选项。引用文档:
需要注意的是,调用process.exit()将强制即使仍有尚未完全完成的未决异步操作,包括process.stdout和process.stderr的I/O操作。在大多数情况下,实际上不需要调用process.exit()显式。Node.js进程将自行退出如果在事件循环中没有附加的待处理工作。这个process.exitCode属性可以设置为告诉进程哪个退出当进程正常退出时使用的代码。
让我们讨论一下您可能愿意退出node.js进程的原因,以及您应该避免process.exit()的原因:
案例1-执行完成(命令行脚本)
若脚本已经结束,而节点解释器并没有退出,则表示某些异步操作仍处于挂起状态。此时使用process.exit()强制进程终止是错误的。最好尝试理解是什么阻碍了脚本以预期的方式退出。当您解决这个问题时,您可以使用process.exitCode将任何结果返回给调用进程。
情况2-因外部信号(SIGINT/SIGTERM/其他)而终止
例如,如果你愿意优雅地关闭快递应用程序。与命令行脚本不同,express应用程序保持无限运行,等待新的请求。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。
案例3-内部错误
抛出错误总是更好的,您将得到格式良好的堆栈跟踪和错误消息。较高级别的代码总是可以决定是否可以处理错误(捕获)或让它使进程崩溃。另一方面,process.ext(1)将无声地终止进程,并没有机会从中恢复。这可能是process.exit()的唯一“好处”,您可以确定该进程将被终止。
REPL(命令行)
按ctrl+c两次键入退出并按回车键
脚本文件
process.exit(code)
当不再挂起异步操作时,节点通常会退出,代码为0。
process.ext(1)应用于退出并显示故障代码。这将允许我们推断节点未正常关闭,并被强制关闭。
还有其他出口代码,如
3-内部JavaScript分析错误(非常罕见)
5-v8 javascript引擎中的致命错误
9-参数无效
有关完整列表,请参阅节点退出代码
我可以通过键入taskkill-F-IM node.exe,让我的所有节点进程直接从Windows 10上的Git Bash shell中消亡-这将立即结束我计算机上的所有节点过程。我发现我也可以使用taskkill//F//IM node.exe。不确定为什么-和//在这种情况下都有效。希望这有帮助!
您可以使用process.ext([code])函数。
如果要退出而不出现“失败”,请使用代码0:
process.exit(0);
要退出并显示“失败”代码1,您可以运行:
process.exit(1);
失败的“失败”代码特定于应用程序。因此,您可以使用自己的约定。
打开运行节点应用程序的命令行终端,然后按Ctrl+C
如果要从代码中退出node js应用程序,
process.exit(); // graceful termination
process.exit(1); // non graceful termination
节点js中的退出有两种方式:
显式调用process.exit()。或者,如果nodejs事件循环完成了所有任务,并且没有任何事情可做。那么,节点应用程序将自动退出。
它是如何工作的?
如果你想强制执行循环停止进程,你可以使用全局变量进程,它是EventEmitter的一个实例。因此,当调用process.exit()时,实际上会发出退出事件,该事件会立即结束所有任务,即使仍有异步操作未完成。
process.exit()将退出代码(整数)作为参数。代码0是默认值,这意味着它将以“成功”退出。而代码1表示它以“失败”退出。
由于进程是全局对象,所以不需要导入任何模块。以下函数退出或终止当前节点进程。
process.ext(代码)process.cill(process.pid)process.abourt()
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.ext(1)。
额外:这里的退出意味着退出典型的nodejs程序。例如,如果此代码位于名为dbOperations.js的文件中,则process.exit将退出,并且不会运行process.exit之后的任何代码
推荐文章
- npm犯错!代码UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- Access-Control-Allow-Origin不允许Origin < Origin >
- 如何获得所有已注册的快捷路线?
- 你可以为你的组织托管一个私有的存储库来使用npm吗?
- 如何定位父文件夹?
- Gulp命令未找到-安装Gulp后错误
- 在Node.js中写入文件时创建目录
- 如何将自定义脚本添加到包中。Json文件,运行javascript文件?
- 使用child_process。execSync但保持输出在控制台
- SyntaxError:在严格模式下使用const
- 在Node.js中递归复制文件夹
- 如何在node.js中设置默认时区?
- “react-scripts”不被视为内部或外部命令
- 如何正确地读取异步/等待文件?
- 错误:无法验证nodejs中的第一个证书