JavaScript >> Javascript 文檔 >  >> Node.js

如何在 Node.js 中退出

在本教程中,我們將向您展示如何退出 Node.js 程序的各種方法。您首先需要了解 Node.js 在單個線程或主進程上工作。您可以生成額外的子進程來處理額外的工作。退出主進程讓我們退出Node。

雖然有很多方法可以從 Node 中退出,但在某些情況下,有些方法比其他方法更好,比如您是否正在運行 REPL。我們將在整篇文章中更詳細地解釋這一點。

讓腳本隱式退出

從命令行啟動的 Node.js 程序退出就像等待腳本完成執行一樣簡單。隱式地,Node.js 進程將在到達腳本末尾時退出。

您可以通過運行以下 scipt 看到這一點:

// batman.js
console.log('Batman begins');

process.on('exit', function(code) {
    return console.log(`About to exit with code ${code}`);
});

使用命令 node batman.js 運行程序 ,你會看到它輸出了關於蝙蝠俠的第一條語句。此外,“退出”回調觸發,導致打印出有關退出的消息和退出代碼。您應該會看到類似於以下內容的內容:

$ node batman.js 
Batman begins
About to exit with code 0

請注意,未決事件和循環將阻止程序退出。在上述腳本的末尾添加這個重複函數。

// batman.js

// ...

setInterval((function() {
    return console.log('I\'m Batman!');
}), 1000);

再次運行它。這一次,程序沒有退出,因為重複的setInterval 功能阻止 Node.js 退出。您的輸出將類似於以下內容:

$ node batman.js 
Batman begins
I'm Batman!
I'm Batman!
I'm Batman!
...

“我是蝙蝠俠!”短語會持續打印,直到您強制退出,例如 Ctrl + C ,或者關閉你的終端。

使用 process.exit()

我們可以使用顯式 process.exit 退出 Node.js 程序 函數調用。 process.exit 函數從當前的 Node.js 進程中退出。它需要一個退出代碼,它是一個整數。

process object 是一個全局變量,可以讓我們管理當前的 Node.js 進程。由於它是全局的,我們可以從 Node.js 程序中的任何地方訪問它,而無需使用 require 導入它。

讓我們更新最後一個因為 setInterval 而沒有退出的程序 功能。這一次,我們將使用 timeout 強制它退出 5 秒後。將以下函數添加到與之前相同的 'batman.js' 腳本中。

// batman.js

// ...

setTimeout((function() {
    return process.exit(22);
}), 5000);

當你運行 node batman.js ,你會注意到這一次,程序運行了一段時間,然後退出,退出代碼為 22。

node batman.js 
Batman begins
I'm Batman!
I'm Batman!
I'm Batman!
I'm Batman!
About to exit with code 22

使用 process.exit 適用於退出 REPL(我們稍後會看到)以及終止正在運行的 Node.js 程序或腳本。

Node.js 將非零代碼解釋為失敗,將退出代碼 0 解釋為成功。

使用 process.kill() 退出 Node.js

我們也可以使用 process.kill 退出 Node.js 殺死正在運行的 Node.js 進程。這個和process.exit的區別 是 process.kill 採用 pid , 或進程 id,我們想要殺死的進程,以及一個可選的 signal 我們要發送到進程。這意味著我們可以發送信號來殺死 Node.js 主進程以外的進程。這在具有許多正在運行的進程的高並發應用程序中很有用。

要殺死主要的 Node 進程,我們只需傳遞 pid 主進程。

要查看此操作,請替換 setTimeout 在我們之前的代碼示例中使用此版本的函數,該版本使用 process.kill .

// batman.js

// ...

setTimeout((function() {
    return process.kill(process.pid);
}), 5000);

在打印了一些相同的語句之後,程序像以前一樣按計劃退出。這次是 pid 也打印到控制台(您的可能與 15 不同):

$ node batman.js 
Batman begins
I'm Batman!
I'm Batman!
I'm Batman!
I'm Batman!
Terminated: 15

此方法也適用於 REPL 以及 Node.js 程序。

如何使用 process.abort 退出 Node.js

同樣,我們可以使用 process.abort 退出 Node.js。此方法適用於 REPL 以及腳本和應用程序。

process.abort的區別 , process.kill , 和 process.exitprocess.abort 總是立即退出 Node.js 並生成一個核心文件。此外,不會運行任何事件回調。

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

注意 :如果ulimit -c 就不會創建剛才提到的核心文件 設置為 0 .有關詳細信息,請參閱本教程。

要查看它的實際效果,請替換 process.kill 調用我們的 batman.js 調用 process.abort 的文件 並運行 node batman.js .

// batman.js

// ...

setTimeout((function() {
    return process.abort();
}), 5000);

當您使用 node batman.js 運行程序時 ,程序像以前一樣打印出這些行,但在超時運行後退出,打印出有關程序在中止時的狀態的一些信息。

$ node batman.js 
Batman begins
I'm Batman!
I'm Batman!
I'm Batman!
I'm Batman!
Abort trap: 6

REPL

由於 REPL(Read-eval-print 循環)是與典型 Node.js 腳本不同類型的執行環境,因此這些退出策略值得擁有自己的特殊部分。這是因為 REPL 是一個交互式環境,不會像腳本那樣隱式退出。

正如我們在前面的一些部分中已經提到的,上述一些策略也適用於 REPL。但是,在這種情況下使用它們並不典型,您應該使用以下方法。

使用組合鍵退出

與 vim 不同,退出 REPL 非常簡單。在正在運行的 REPL 中,您可以使用組合鍵 Ctrl + C 退出它 , 並鍵入兩次。這會將 SIGINT 或中斷信號發送到 REPL。這通常用於在 POSIX 系統中退出程序。

使用 .exit 命令

我們還可以使用命令“.exit”退出 Node.js REPL。當您在正在運行的 Node REPL 中輸入它時,當前的 REPL 將退出。此調用的工作方式類似於 Ctrl + C 上面討論的方法。

結論

在很多情況下,使用 process.exit 足以退出 Node.js。然而,正如我們所看到的,有許多替代方案。各種方法使您可以靈活地從代碼中的任何特定位置退出。但是,您需要小心使用這種額外的功能,不要插入可能導致計劃外退出、導致程序崩潰的危險代碼。


Tutorial JavaScript 教程
  1. 通過構建計數器應用程序學習 JavaScript 基礎知識

  2. 檢查項目是否在 DOM 中並執行 javascript 函數的問題

  3. 在 React Js Axios 請求中獲取 CROS 錯誤

  4. RxJS:歡迎加入升級版 ShareReplay 運算符

  5. 如何在CKEDITOR中動態插入文本

  6. 10 個免費資源,助您開啟 Vue 開發者的職業生涯

  7. 將 Suspense 與 react-query 一起使用

  1. 帶默認參數的 JavaScript 函數 |設置默認參數示例

  2. React 和前端面試常見問題

  3. 拾音器 #0

  4. 如何在設置路由的情況下添加“上下文”?

  5. jQuery DataTables 頭部兩行:第一行列名和排序,第二行過濾

  6. iOS 上的 React Native 對比移動設備上的 React Web

  7. 如何使用 Firebase 構建自己的評論系統

  1. 在 Express.js 中處理身份驗證

  2. SpookyBot,一個開源的 Discord 機器人

  3. JavaScript 是異步的(這太棒了)

  4. 如何使用 Angular 和 Google 地圖實現地址搜索