tutorial - 如何在Node.js中退出




node.js php (10)

REPL (命令行)

  • 兩次 ctrl + c

  • 輸入.exit並按回車

腳本文件

process.exit(code)

當沒有更多的異步操作掛起時,節點通常以代碼0退出。

process.exit(1)應該用於以失敗代碼退出。這將允許我們推斷該節點沒有優雅地關閉並且被迫關閉。

還有其他退出代碼

3 - 內部JavaScript解析錯誤(非常非常罕見)

5 - v8 javascript引擎中的致命錯誤

9 - 無效的參數

完整列表請參見節點退出代碼

什麼是用於退出的命令? (即終止node.js過程)


命令行

CTRL + C兩次

要么

輸入.exit並按回車

腳本文件

process.exit(code)

如果你想退出節點js應用程序,然後寫

process.exit(1)

在你的代碼中


如果您處於Unix終端或Windows命令行中,並且想要退出節點REPL,則...

  • Ctrl + C兩次,或
  • 鍵入.exit並按Enter,或
  • 在一行的開始處按Ctrl + D (僅適用於Unix)

從官方的nodejs.org文檔:

process.exit(code)

以指定的代碼結束進程。 如果省略,退出使用'成功'代碼0。

以“失敗”代碼退出:

process.exit(1);

我可以通過鍵入taskkill -F -IM node.exe直接從Windows 10上的Git Bash shell中獲取所有節點進程,這一次終止了我計算機上的所有節點進程。 我發現我也可以使用taskkill //F //IM node.exe 。 不知道為什麼這兩個-和/ /在這方面工作。 希望這可以幫助!


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


請注意, exit使用process.exit([number])

這是有問題的原因是因為寫入Node.js中的process.stdout是非阻塞的,並且可能發生在Node.js事件循環的多個tick上。 但是,調用process.exit()會強制進程退出,然後才能執行對stdout的額外寫入操作。

代碼應該直接調用process.exit(),而不是直接調用process.exit(),而是通過避免為事件循環安排額外的工作來設置process.exitCode並允許進程自然退出:

如果你可以,你應該設置退出代碼,並允許節點退出:

process.exitCode = 1;

這取決於你願意退出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.exit()是錯誤的。 最好試著理解什麼阻止你的腳本以預期的方式退出 。 當你解決這個問題時,你可以使用process.exitCode將任何結果返回給調用進程。

情況2 - 由於外部信號而終止(SIGINT / SIGTERM / other)

例如,如果您願意優雅地關閉快速應用程序。 與命令行腳本不同,快速應用程序無限運行,等待新的請求。 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()的唯一“優點”,您可以確定該進程將被終止。


調用全局process對象的exit方法:

process.exit()

從文檔:

process.exit([代碼])

以指定的code結束進程。 如果省略,退出使用'成功'代碼0

以“失敗”代碼退出:

process.exit(1);

執行節點的shell應該看到退出代碼為1。





node.js