如何退出Node.js

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

1113677 次浏览

nodejs.org留档:

process.exit(code)

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

要使用“失败”代码退出:

process.exit(1);

调用全局#0对象的#1方法:

process.exit()

从文档:

process.exit([exitcode])

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

要使用“失败”代码退出:

process.exit(1);

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

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

  • Ctrl+C两次,或
  • 键入.exit并按回车键,或
  • 在一行的开头按Ctrl+D(仅限Unix)

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

$ node> .exit$

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

从正常程序中,使用#0

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

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

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

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

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

  1. 向用户发送电子邮件
  2. 返回错误代码退出

我必须将process.exit(code)挂钩到exit事件处理程序,否则邮件将不会发送,因为调用process.exit(code)直接杀死异步事件。

#!/usr/bin/nodejsvar 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.exit([number])不建议实践。

调用process.exit()将强制进程尽快退出即使仍然有异步操作等待尚未完全完成,包括I/O操作process.stdoutprocess.stderr

在大多数情况下,实际上没有必要调用process.exit(),Node.js进程将自动退出事件循环中没有其他工作挂起。该process.exitCode属性可以设置为告诉进程哪个退出当进程优雅退出时使用的代码。

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

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

原因是问题是因为写入process.stdout在Node.js有时是异步的,可能发生在Node.js事件循环。但是,调用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;}

正如@Dominic指出的,抛出未捕获的错误process.exit([代码])更好:
process.exitCode=1;抛出新的错误(“我的模块xx条件失败”);

要退出

let exitCode = 1;process.exit(exitCode)

有用的退出代码

1 - Catchall for general errors2 - Misuse of shell builtins (according to Bash documentation)126 - Command invoked cannot execute127 - “command not found”128 - Invalid argument to exit128+n - Fatal error signal “n”130 - Script terminated by Control-C255\* - Exit status out of range

这取决于您愿意退出node.js进程的原因,但无论如何process.exit()最后一个考虑。来自留档的报价:

需要注意的是,调用process.exit()将强制进程尽快退出,即使仍然存在尚未完全完成的挂起的异步操作,包括对process.stdoutprocess.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)。客户端永远不会知道这些请求是否在服务器端完成,这可能是客户端和服务器之间数据不一致的原因。唯一好的解决方案是告诉超文本传输协议服务器停止接受新请求并等待挂起的请求以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()的唯一“好处”,你可以确定进程将被终止。

REPL(命令行)

  • ctrl + c两次

  • 输入.exit并按回车键

脚本文件

process.exit(code)

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

这将允许我们推断节点没有正常关闭,而是被迫关闭。

还有其他的退出密码

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

5-V8 JavaScript引擎中的致命错误

9-无效参数

完整列表见节点退出码

如果你想退出node js应用程序,那么写

process.exit(1)

在您的代码

我能够通过键入taskkill -F -IM node.exe让我所有的节点进程直接从Windows 10上的Git Bash shell中死亡-这一次结束了我计算机上的所有节点进程。我发现我也可以使用taskkill //F //IM node.exe。不知道为什么-//都在这种情况下工作。希望这有帮助!

Ctrl + C两次.exit

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

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

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

process.exit(0);

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

process.exit(1);

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

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

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

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

节点js中的退出有两种方式:

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

它是如何工作的?

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

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

由于进程是全局对象,因此不需要导入任何模块。

process.exit(代码)

process.kill(process.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
}
}

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

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

添加

process.exit(1);

会对你起作用的

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