如何在Node.js中退出

时间:2011-03-10 21:30:06

标签: node.js

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

22 个答案:

答案 0 :(得分:2044)

调用全局process对象的exit方法:

process.exit()

From the docs:

  

process.exit([代码])

     

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

     

以“失败”代码退出:

process.exit(1);
     

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

答案 1 :(得分:351)

来自官方nodejs.org文档:

process.exit(code)

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

以“失败”代码退出:

process.exit(1);

答案 2 :(得分:281)

请注意,使用process.exit([number])not recommended练习。

  

调用process.exit()将强制进程尽快退出   即使仍然存在异步操作,也可能   还没有完全完成,包括I / O操作   process.stdout和process.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);
}
     

原因是这样的   有问题的是因为对Node.js中的process.stdout的写入是   有时是异步的,可能发生在多个滴答声中   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;
}

答案 3 :(得分:253)

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

  • 按两次 Ctrl + C
  • 键入.exit,然后按Enter或
  • 在行的开头按 Ctrl + D (仅限Unix)

答案 4 :(得分:115)

从命令行,.exit就是您想要的:

$ node
> .exit
$

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

从正常程序中,使用process.exit([code])

答案 5 :(得分:66)

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

  

重要的是要注意,调用process.exit()会强制执行   即使仍然存在,也要尽快退出   尚未完全完成的异步操作挂起,   包括process.stdoutprocess.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 /其他)

而终止

例如,如果您愿意优雅地关闭快递应用。与命令行脚本不同,快速应用程序可以无限运行,等待新请求。 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 - 内部错误

throw错误总是更好,您将获得格式良好的堆栈跟踪和错误消息。较高级别的代码总是可以决定它们是否可以处理错误(catch)或让它崩溃进程。另一方面,process.exit(1)将以静默方式终止进程,并且没有机会从此恢复。它可能是process.exit()的唯一“好处”,您可以确定该过程将被终止。

答案 6 :(得分:24)

REPL (命令行)

  • ctrl + c 两次

  • 输入.exit并按Enter键

脚本文件

process.exit(code)

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

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

还有其他退出代码,例如

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

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

9 - 参数无效

有关完整列表,请参阅its doc entry

答案 7 :(得分:12)

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

  1. 向用户发送电子邮件
  2. 退出并显示错误代码
  3. 我必须将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); });
    

答案 8 :(得分:9)

正如@Dominic所指出的,throwing an uncaught error是更好的做法而不是调用 process.exit([code])
process.exitCode = 1; throw new Error("my module xx condition failed");

答案 9 :(得分:7)

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

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

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

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

答案 10 :(得分:7)

退出

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

答案 11 :(得分:7)

Ctrl + C两次 或.exit

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

答案 12 :(得分:3)

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

答案 13 :(得分:3)

命令行

按两次 CTRL + C

OR

输入.exit并按Enter键

脚本文件

process.exit(code)

答案 14 :(得分:1)

添加

process.exit(1);

会为你解决问题

答案 15 :(得分:0)

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

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

它如何工作?

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

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

答案 16 :(得分:0)

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

  

process.exit(代码)

     

process.kill(process.pid)

     

process.abort()

答案 17 :(得分:0)

如果您使用的是Windows,请转至“任务管理器”,然后转至“进程”,查找一个名为“节点”的进程,然后用鼠标右键单击该进程,然后单击“结束进程”选项。

答案 18 :(得分:0)

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(),而该参数中没有任何内容。 如果出现错误,那么我们需要退出并发送一条不成功的消息,因此我们在像process.exit(1)这样的参数中传递1。

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

答案 19 :(得分:0)

如果要退出节点js应用程序,则写入

process.exit(1)

代码

答案 20 :(得分:-1)

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

如果要退出而不会出现“失败”,请使用代码0

process.exit(0);

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

process.exit(1);

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

答案 21 :(得分:-1)

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

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

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