程序#

原始碼: lib/process.js

process 物件提供有關當前 Node.js 程序的資訊並對其進行控制。

import process from 'node:process';const process = require('node:process');

程序事件#

process 物件是 EventEmitter 的一個例項。

事件:'beforeExit'#

當 Node.js 清空其事件迴圈並且沒有額外的工作要排程時,會發出 'beforeExit' 事件。通常,當沒有工作被排程時,Node.js 程序將退出,但在 'beforeExit' 事件上註冊的監聽器可以進行非同步呼叫,從而導致 Node.js 程序繼續執行。

監聽器回撥函式被呼叫時,會將 process.exitCode 的值作為唯一的引數傳入。

對於導致顯式終止的條件,例如呼叫 process.exit() 或未捕獲的異常,不會發出 'beforeExit' 事件。

除非意圖是排程額外的工作,否則不應'beforeExit' 用作 'exit' 事件的替代方案。

import process from 'node:process';

process.on('beforeExit', (code) => {
  console.log('Process beforeExit event with code: ', code);
});

process.on('exit', (code) => {
  console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');

// Prints:
// This message is displayed first.
// Process beforeExit event with code: 0
// Process exit event with code: 0const process = require('node:process');

process.on('beforeExit', (code) => {
  console.log('Process beforeExit event with code: ', code);
});

process.on('exit', (code) => {
  console.log('Process exit event with code: ', code);
});

console.log('This message is displayed first.');

// Prints:
// This message is displayed first.
// Process beforeExit event with code: 0
// Process exit event with code: 0

事件:'disconnect'#

如果 Node.js 程序是使用 IPC 通道衍生的(請參閱子程序叢集文件),當 IPC 通道關閉時,將發出 'disconnect' 事件。

事件:'exit'#

當 Node.js 程序因以下任一原因即將退出時,會發出 'exit' 事件:

  • 顯式呼叫了 process.exit() 方法;
  • Node.js 事件迴圈不再有任何額外的工作要執行。

此時無法阻止事件迴圈的退出,並且一旦所有 'exit' 監聽器執行完畢,Node.js 程序將終止。

監聽器回撥函式被呼叫時,會傳入由 process.exitCode 屬性指定的退出碼,或者是傳遞給 process.exit() 方法的 exitCode 引數。

import process from 'node:process';

process.on('exit', (code) => {
  console.log(`About to exit with code: ${code}`);
});const process = require('node:process');

process.on('exit', (code) => {
  console.log(`About to exit with code: ${code}`);
});

監聽器函式必須只執行同步操作。在呼叫 'exit' 事件監聽器後,Node.js 程序將立即退出,導致事件迴圈中任何仍在排隊的額外工作被放棄。例如,在下面的例子中,超時永遠不會發生:

import process from 'node:process';

process.on('exit', (code) => {
  setTimeout(() => {
    console.log('This will not run');
  }, 0);
});const process = require('node:process');

process.on('exit', (code) => {
  setTimeout(() => {
    console.log('This will not run');
  }, 0);
});

事件:'message'#

如果 Node.js 程序是使用 IPC 通道衍生的(請參閱子程序叢集文件),每當子程序收到由父程序使用 childprocess.send() 傳送的訊息時,就會發出 'message' 事件。

訊息會經過序列化和解析。最終收到的訊息可能與最初發送的訊息不同。

如果在衍生程序時將 serialization 選項設定為 advanced,那麼 message 引數可以包含 JSON 無法表示的資料。更多詳情請參閱child_process 的高階序列化

事件:'rejectionHandled'#

  • promise <Promise> 被延遲處理的 Promise。

每當一個 Promise 被拒絕,並且在 Node.js 事件迴圈的一個輪次之後,有錯誤處理程式附加到它上面時(例如,使用 promise.catch()),就會發出 'rejectionHandled' 事件。

Promise 物件之前會在 'unhandledRejection' 事件中被髮出,但在處理過程中獲得了拒絕處理程式。

對於一個 Promise 鏈來說,沒有一個頂層的概念,可以在那裡總是處理拒絕。由於其固有的非同步性,一個 Promise 的拒絕可以在未來的某個時間點被處理,可能遠晚於發出 'unhandledRejection' 事件的那個事件迴圈輪次。

換句話說,與同步程式碼中有一個不斷增長的未處理異常列表不同,對於 Promises,可能有一個增長和縮小的未處理拒絕列表。

在同步程式碼中,當未處理異常列表增長時,會發出 'uncaughtException' 事件。

在非同步程式碼中,當未處理拒絕列表增長時,會發出 'unhandledRejection' 事件;當未處理拒絕列表縮小時,會發出 'rejectionHandled' 事件。

import process from 'node:process';

const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, promise) => {
  unhandledRejections.set(promise, reason);
});
process.on('rejectionHandled', (promise) => {
  unhandledRejections.delete(promise);
});const process = require('node:process');

const unhandledRejections = new Map();
process.on('unhandledRejection', (reason, promise) => {
  unhandledRejections.set(promise, reason);
});
process.on('rejectionHandled', (promise) => {
  unhandledRejections.delete(promise);
});

在這個例子中,unhandledRejections Map 會隨著時間的推移而增長和縮小,反映了那些開始時未處理,後來被處理的拒絕。可以將這些錯誤記錄在錯誤日誌中,可以定期記錄(這對於長期執行的應用程式可能是最好的),也可以在程序退出時記錄(這對於指令碼來說可能最方便)。

事件:'workerMessage'#

對於另一方使用 postMessageToThread() 傳送的任何傳入訊息,都會發出 'workerMessage' 事件。

事件:'uncaughtException'#

  • err <Error> 未捕獲的異常。
  • origin <string> 指示異常是源自未處理的拒絕還是同步錯誤。可以是 'uncaughtException''unhandledRejection'。當異常發生在基於 Promise 的非同步上下文中(或者如果一個 Promise 被拒絕),並且 --unhandled-rejections 標誌設定為 strictthrow(這是預設值)且該拒絕未被處理時,或者當拒絕發生在命令列入口點的 ES 模組靜態載入階段時,會使用後者。

當一個未捕獲的 JavaScript 異常一直冒泡到事件迴圈時,會發出 'uncaughtException' 事件。預設情況下,Node.js 透過將堆疊跟蹤列印到 stderr 並以程式碼 1 退出,來處理此類異常,這會覆蓋任何先前設定的 process.exitCode。為 'uncaughtException' 事件新增一個處理程式會覆蓋此預設行為。或者,在 'uncaughtException' 處理程式中更改 process.exitCode,這將導致程序以提供的退出碼退出。否則,在存在此類處理程式的情況下,程序將以 0 退出。

import process from 'node:process';
import fs from 'node:fs';

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}\n`,
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');const process = require('node:process');
const fs = require('node:fs');

process.on('uncaughtException', (err, origin) => {
  fs.writeSync(
    process.stderr.fd,
    `Caught exception: ${err}\n` +
    `Exception origin: ${origin}\n`,
  );
});

setTimeout(() => {
  console.log('This will still run.');
}, 500);

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
console.log('This will not run.');

可以透過安裝一個 'uncaughtExceptionMonitor' 監聽器來監視 'uncaughtException' 事件,而無需覆蓋退出程序的預設行為。

警告:正確使用 'uncaughtException'#

'uncaughtException' 是一種粗糙的異常處理機制,僅應作為最後的手段使用。該事件不應用作 On Error Resume Next 的等價物。未處理的異常本質上意味著應用程式處於未定義狀態。在沒有從異常中正確恢復的情況下嘗試恢復應用程式程式碼,可能會導致額外的、不可預見和不可預測的問題。

從事件處理程式內部丟擲的異常將不會被捕獲。相反,程序將以非零退出碼退出,並列印堆疊跟蹤。這是為了避免無限遞迴。

在未捕獲異常後嘗試正常恢復,可能類似於在升級計算機時拔掉電源線。十次中有九次,什麼也不會發生。但第十次,系統會損壞。

'uncaughtException' 的正確用法是在關閉程序之前對已分配的資源(例如檔案描述符、控制代碼等)進行同步清理。'uncaughtException' 之後恢復正常操作是不安全的。

要以更可靠的方式重新啟動崩潰的應用程式,無論是否發出 'uncaughtException',都應在單獨的程序中使用外部監視器來檢測應用程式故障並根據需要進行恢復或重新啟動。

事件:'uncaughtExceptionMonitor'#

  • err <Error> 未捕獲的異常。
  • origin <string> 指示異常是源於未處理的拒絕還是同步錯誤。可以是 'uncaughtException''unhandledRejection'。當異常發生在基於 Promise 的非同步上下文中(或者如果一個 Promise 被拒絕),並且 --unhandled-rejections 標誌設定為 strictthrow(這是預設值)且該拒絕未被處理時,或者當拒絕發生在命令列入口點的 ES 模組靜態載入階段時,會使用後者。

'uncaughtExceptionMonitor' 事件在發出 'uncaughtException' 事件或呼叫透過 process.setUncaughtExceptionCaptureCallback() 安裝的鉤子之前發出。

安裝一個 'uncaughtExceptionMonitor' 監聽器並不會改變 'uncaughtException' 事件被觸發後的行為。如果沒有安裝 'uncaughtException' 監聽器,程序仍然會崩潰。

import process from 'node:process';

process.on('uncaughtExceptionMonitor', (err, origin) => {
  MyMonitoringTool.logSync(err, origin);
});

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
// Still crashes Node.jsconst process = require('node:process');

process.on('uncaughtExceptionMonitor', (err, origin) => {
  MyMonitoringTool.logSync(err, origin);
});

// Intentionally cause an exception, but don't catch it.
nonexistentFunc();
// Still crashes Node.js

事件:'unhandledRejection'#

  • reason <Error> | <any> Promise 被拒絕時所使用的物件(通常是一個 Error 物件)。
  • promise <Promise> 被拒絕的 Promise。

當一個 Promise 被拒絕,並且在事件迴圈的一個輪次內沒有錯誤處理程式附加到該 Promise 上時,就會發出 'unhandledRejection' 事件。在使用 Promise 程式設計時,異常被封裝為“被拒絕的 Promise”。拒絕可以透過 promise.catch() 來捕獲和處理,並在 Promise 鏈中傳播。'unhandledRejection' 事件對於檢測和跟蹤那些被拒絕但其拒絕尚未被處理的 Promise 非常有用。

import process from 'node:process';

process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection at:', promise, 'reason:', reason);
  // Application specific logging, throwing an error, or other logic here
});

somePromise.then((res) => {
  return reportToUser(JSON.pasre(res)); // Note the typo (`pasre`)
}); // No `.catch()` or `.then()`const process = require('node:process');

process.on('unhandledRejection', (reason, promise) => {
  console.log('Unhandled Rejection at:', promise, 'reason:', reason);
  // Application specific logging, throwing an error, or other logic here
});

somePromise.then((res) => {
  return reportToUser(JSON.pasre(res)); // Note the typo (`pasre`)
}); // No `.catch()` or `.then()`

以下情況也會觸發 'unhandledRejection' 事件的發出:

import process from 'node:process';

function SomeResource() {
  // Initially set the loaded status to a rejected promise
  this.loaded = Promise.reject(new Error('Resource not yet loaded!'));
}

const resource = new SomeResource();
// no .catch or .then on resource.loaded for at least a turnconst process = require('node:process');

function SomeResource() {
  // Initially set the loaded status to a rejected promise
  this.loaded = Promise.reject(new Error('Resource not yet loaded!'));
}

const resource = new SomeResource();
// no .catch or .then on resource.loaded for at least a turn

在這種示例情況下,可以像對待其他 'unhandledRejection' 事件一樣,將此拒絕追蹤為開發者錯誤。為了解決此類失敗,可以向 resource.loaded 附加一個無操作的 .catch(() => { }) 處理程式,這將阻止 'unhandledRejection' 事件的發出。

如果發出一個 'unhandledRejection' 事件但未被處理,它將被提升為一個未捕獲的異常。這個行為以及 'unhandledRejection' 事件的其他行為可以透過 --unhandled-rejections 標誌來更改。

事件:'warning'#

  • warning <Error> 警告的關鍵屬性是:
    • name <string> 警告的名稱。預設: 'Warning'
    • message <string> 系統提供的警告描述。
    • stack <string> 指向程式碼中發出警告位置的堆疊跟蹤。

每當 Node.js 發出程序警告時,就會發出 'warning' 事件。

程序警告與錯誤類似,它描述了提請使用者注意的異常情況。然而,警告不屬於正常的 Node.js 和 JavaScript 錯誤處理流程。當 Node.js 檢測到可能導致應用程式效能不佳、錯誤或安全漏洞的不良編碼實踐時,可以發出警告。

import process from 'node:process';

process.on('warning', (warning) => {
  console.warn(warning.name);    // Print the warning name
  console.warn(warning.message); // Print the warning message
  console.warn(warning.stack);   // Print the stack trace
});const process = require('node:process');

process.on('warning', (warning) => {
  console.warn(warning.name);    // Print the warning name
  console.warn(warning.message); // Print the warning message
  console.warn(warning.stack);   // Print the stack trace
});

預設情況下,Node.js 會將程序警告列印到 stderr。可以使用 --no-warnings 命令列選項來抑制預設的控制檯輸出,但 process 物件仍然會發出 'warning' 事件。目前,除了棄用警告之外,無法抑制特定型別的警告。要抑制棄用警告,請檢視 --no-deprecation 標誌。

以下示例說明了當向一個事件添加了過多監聽器時,列印到 stderr 的警告:

$ node
> events.defaultMaxListeners = 1;
> process.on('foo', () => {});
> process.on('foo', () => {});
> (node:38638) MaxListenersExceededWarning: Possible EventEmitter memory leak
detected. 2 foo listeners added. Use emitter.setMaxListeners() to increase limit 

相比之下,以下示例關閉了預設的警告輸出,並向 'warning' 事件添加了一個自定義處理程式:

$ node --no-warnings
> const p = process.on('warning', (warning) => console.warn('Do not do that!'));
> events.defaultMaxListeners = 1;
> process.on('foo', () => {});
> process.on('foo', () => {});
> Do not do that! 

可以使用 --trace-warnings 命令列選項,使警告的預設控制檯輸出包含警告的完整堆疊跟蹤。

使用 --throw-deprecation 命令列標誌啟動 Node.js 將導致自定義的棄用警告被作為異常丟擲。

使用 --trace-deprecation 命令列標誌將導致自定義的棄用資訊連同堆疊跟蹤一起列印到 stderr

使用 --no-deprecation 命令列標誌將抑制所有關於自定義棄用的報告。

*-deprecation 命令列標誌僅影響使用名稱 'DeprecationWarning' 的警告。

發出自定義警告#

請參閱 process.emitWarning() 方法來發布自定義或特定於應用程式的警告。

Node.js 警告名稱#

對於 Node.js 發出的警告型別(由 name 屬性標識)沒有嚴格的指導方針。新的警告型別可以隨時新增。一些最常見的警告型別包括:

  • 'DeprecationWarning' - 表示使用了已棄用的 Node.js API 或功能。此類警告必須包含一個 'code' 屬性,以標識棄用程式碼
  • 'ExperimentalWarning' - 表示使用了實驗性的 Node.js API 或功能。使用這些功能時必須謹慎,因為它們可能隨時更改,並且不受與受支援功能相同的嚴格語義版本控制和長期支援策略的約束。
  • 'MaxListenersExceededWarning' - 表示在 EventEmitterEventTarget 上為給定事件註冊了過多的監聽器。這通常是記憶體洩漏的跡象。
  • 'TimeoutOverflowWarning' - 表示向 setTimeout()setInterval() 函式提供了一個無法容納在 32 位有符號整數中的數值。
  • 'TimeoutNegativeWarning' - 表示向 setTimeout()setInterval() 函式提供了負數。
  • 'TimeoutNaNWarning' - 表示向 setTimeout()setInterval() 函式提供了非數字值。
  • 'UnsupportedWarning' - 表示使用了不受支援的選項或功能,該選項或功能將被忽略而不是被視為錯誤。一個例子是在使用 HTTP/2 相容性 API 時使用 HTTP 響應狀態訊息。

事件:'worker'#

在建立新的 <Worker> 執行緒後,會發出 'worker' 事件。

訊號事件#

當 Node.js 程序接收到訊號時,將發出訊號事件。請參閱 signal(7) 以獲取標準 POSIX 訊號名稱的列表,例如 'SIGINT''SIGHUP' 等。

訊號在 Worker 執行緒中不可用。

訊號處理程式將接收訊號的名稱('SIGINT''SIGTERM' 等)作為第一個引數。

每個事件的名稱將是訊號的大寫通用名稱(例如,SIGINT 訊號的 'SIGINT')。

import process from 'node:process';

// Begin reading from stdin so the process does not exit.
process.stdin.resume();

process.on('SIGINT', () => {
  console.log('Received SIGINT. Press Control-D to exit.');
});

// Using a single function to handle multiple signals
function handle(signal) {
  console.log(`Received ${signal}`);
}

process.on('SIGINT', handle);
process.on('SIGTERM', handle);const process = require('node:process');

// Begin reading from stdin so the process does not exit.
process.stdin.resume();

process.on('SIGINT', () => {
  console.log('Received SIGINT. Press Control-D to exit.');
});

// Using a single function to handle multiple signals
function handle(signal) {
  console.log(`Received ${signal}`);
}

process.on('SIGINT', handle);
process.on('SIGTERM', handle);
  • 'SIGUSR1' 由 Node.js 保留用於啟動偵錯程式。可以安裝監聽器,但這樣做可能會干擾偵錯程式。
  • 在非 Windows 平臺上,'SIGTERM''SIGINT' 有預設處理程式,它們會在退出前重置終端模式,退出碼為 128 + 訊號編號。如果為這些訊號之一安裝了監聽器,其預設行為將被移除(Node.js 將不再退出)。
  • 'SIGPIPE' 預設被忽略。可以為其安裝監聽器。
  • 'SIGHUP' 在 Windows 上關閉控制檯視窗時生成,在其他平臺上則在各種類似條件下生成。請參閱 signal(7)。可以為其安裝監聽器,但是大約 10 秒後 Node.js 將被 Windows 無條件終止。在非 Windows 平臺上,SIGHUP 的預設行為是終止 Node.js,但一旦安裝了監聽器,其預設行為將被移除。
  • Windows 不支援 'SIGTERM',但可以監聽它。
  • 來自終端的 'SIGINT' 在所有平臺上都受支援,通常可以透過 Ctrl+C 生成(儘管這可能是可配置的)。當啟用終端原始模式並使用 Ctrl+C 時,不會生成該訊號。
  • 在 Windows 上按下 Ctrl+Break 時會發送 'SIGBREAK'。在非 Windows 平臺上,可以監聽它,但沒有辦法傳送或生成它。
  • 當控制檯大小調整時,會發送 'SIGWINCH'。在 Windows 上,這隻會在向控制檯寫入、游標移動時,或者當可讀 tty 在原始模式下使用時發生。
  • 'SIGKILL' 不能安裝監聽器,它會在所有平臺上無條件終止 Node.js。
  • 'SIGSTOP' 不能安裝監聽器。
  • 'SIGBUS''SIGFPE''SIGSEGV''SIGILL',當不是透過 kill(2) 人為引發時,本質上會將程序置於一個不安全的狀態,無法呼叫 JS 監聽器。這樣做可能會導致程序停止響應。
  • 可以傳送 0 來測試程序是否存在,如果程序存在則沒有效果,但如果程序不存在則會丟擲錯誤。

Windows 不支援訊號,因此沒有與透過訊號終止等效的操作,但 Node.js 透過 process.kill()subprocess.kill() 提供了一些模擬功能。

  • 傳送 SIGINTSIGTERMSIGKILL 將導致目標程序無條件終止,之後,子程序將報告該程序被訊號終止。
  • 傳送訊號 0 可以作為一種平臺無關的方式來測試程序是否存在。

process.abort()#

process.abort() 方法會使 Node.js 程序立即退出並生成一個核心檔案。

此功能在 Worker 執行緒中不可用。

process.allowedNodeEnvironmentFlags#

process.allowedNodeEnvironmentFlags 屬性是一個特殊的、只讀的 Set,包含了在 NODE_OPTIONS 環境變數中允許的標誌。

process.allowedNodeEnvironmentFlags 擴充套件了 Set,但重寫了 Set.prototype.has 以識別幾種不同的可能標誌表示形式。在以下情況下,process.allowedNodeEnvironmentFlags.has() 將返回 true

  • 標誌可以省略前導的單個(-)或雙(--)破折號;例如,inspect-brk 代表 --inspect-brk,或 r 代表 -r
  • 傳遞給 V8 的標誌(如 --v8-options 中所列)可以將一個或多個非前導的破折號替換為下劃線,反之亦然;例如,--perf_basic_prof--perf-basic-prof--perf_basic-prof 等。
  • 標誌可以包含一個或多個等號(=)字元;第一個等號及其之後的所有字元都將被忽略;例如,--stack-trace-limit=100
  • 標誌必須NODE_OPTIONS 中是允許的。

當迭代 process.allowedNodeEnvironmentFlags 時,標誌將只出現一次;每個標誌都將以一個或多個破折號開頭。傳遞給 V8 的標誌將包含下劃線而不是非前導的破折號:

import { allowedNodeEnvironmentFlags } from 'node:process';

allowedNodeEnvironmentFlags.forEach((flag) => {
  // -r
  // --inspect-brk
  // --abort_on_uncaught_exception
  // ...
});const { allowedNodeEnvironmentFlags } = require('node:process');

allowedNodeEnvironmentFlags.forEach((flag) => {
  // -r
  // --inspect-brk
  // --abort_on_uncaught_exception
  // ...
});

process.allowedNodeEnvironmentFlagsadd()clear()delete() 方法什麼也不做,並且會靜默失敗。

如果 Node.js 編譯時沒有 NODE_OPTIONS 支援(顯示在 process.config 中),process.allowedNodeEnvironmentFlags 將包含本應允許的內容。

process.arch#

Node.js 二進位制檔案編譯時所針對的作業系統 CPU 架構。可能的值有:'arm''arm64''ia32''loong64''mips''mipsel''ppc64''riscv64''s390''s390x''x64'

import { arch } from 'node:process';

console.log(`This processor architecture is ${arch}`);const { arch } = require('node:process');

console.log(`This processor architecture is ${arch}`);

process.argv#

process.argv 屬性返回一個數組,其中包含啟動 Node.js 程序時傳遞的命令列引數。第一個元素將是 process.execPath。如果需要訪問 argv[0] 的原始值,請參見 process.argv0。第二個元素將是正在執行的 JavaScript 檔案的路徑。其餘元素將是任何額外的命令列引數。

例如,假設有以下指令碼 process-args.js

import { argv } from 'node:process';

// print process.argv
argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});const { argv } = require('node:process');

// print process.argv
argv.forEach((val, index) => {
  console.log(`${index}: ${val}`);
});

像這樣啟動 Node.js 程序:

node process-args.js one two=three four 

將會生成輸出:

0: /usr/local/bin/node
1: /Users/mjr/work/node/process-args.js
2: one
3: two=three
4: four 

process.argv0#

process.argv0 屬性儲存了 Node.js 啟動時傳遞的 argv[0] 原始值的只讀副本。

$ bash -c 'exec -a customArgv0 ./node'
> process.argv[0]
'/Volumes/code/external/node/out/Release/node'
> process.argv0
'customArgv0' 

process.availableMemory()#

獲取程序仍然可用的空閒記憶體量(以位元組為單位)。

更多資訊請參閱 uv_get_available_memory

process.channel#

如果 Node.js 程序是使用 IPC 通道衍生的(參見子程序文件),process.channel 屬性是對 IPC 通道的引用。如果不存在 IPC 通道,此屬性為 undefined

process.channel.ref()#

如果之前呼叫過 .unref(),此方法會使 IPC 通道保持程序的事件迴圈執行。

通常,這是透過 process 物件上的 'disconnect''message' 監聽器數量來管理的。但是,可以使用此方法來明確請求特定行為。

process.channel.unref()#

此方法使 IPC 通道不保持程序的事件迴圈執行,並允許其在通道仍然開啟的情況下完成。

通常,這是透過 process 物件上的 'disconnect''message' 監聽器數量來管理的。但是,可以使用此方法來明確請求特定行為。

process.chdir(directory)#

process.chdir() 方法更改 Node.js 程序的當前工作目錄,如果操作失敗(例如,如果指定的 directory 不存在),則丟擲異常。

import { chdir, cwd } from 'node:process';

console.log(`Starting directory: ${cwd()}`);
try {
  chdir('/tmp');
  console.log(`New directory: ${cwd()}`);
} catch (err) {
  console.error(`chdir: ${err}`);
}const { chdir, cwd } = require('node:process');

console.log(`Starting directory: ${cwd()}`);
try {
  chdir('/tmp');
  console.log(`New directory: ${cwd()}`);
} catch (err) {
  console.error(`chdir: ${err}`);
}

此功能在 Worker 執行緒中不可用。

process.config#

process.config 屬性返回一個凍結的 Object,其中包含用於編譯當前 Node.js 可執行檔案的配置選項的 JavaScript 表示。這與執行 ./configure 指令碼時生成的 config.gypi 檔案相同。

可能的輸出示例如下:

{
  target_defaults:
   { cflags: [],
     default_configuration: 'Release',
     defines: [],
     include_dirs: [],
     libraries: [] },
  variables:
   {
     host_arch: 'x64',
     napi_build_version: 5,
     node_install_npm: 'true',
     node_prefix: '',
     node_shared_cares: 'false',
     node_shared_http_parser: 'false',
     node_shared_libuv: 'false',
     node_shared_zlib: 'false',
     node_use_openssl: 'true',
     node_shared_openssl: 'false',
     target_arch: 'x64',
     v8_use_snapshot: 1
   }
} 

process.connected#

如果 Node.js 程序是使用 IPC 通道衍生的(請參閱子程序叢集文件),只要 IPC 通道連線著,process.connected 屬性將返回 true,在呼叫 process.disconnect() 後將返回 false

一旦 process.connected 變為 false,就不能再透過 IPC 通道使用 process.send() 傳送訊息了。

process.constrainedMemory()#

根據作業系統施加的限制,獲取程序可用的記憶體量(以位元組為單位)。如果沒有這樣的約束,或者約束未知,則返回 0

更多資訊請參閱 uv_get_constrained_memory

process.cpuUsage([previousValue])#

process.cpuUsage() 方法返回當前程序的使用者和系統 CPU 時間使用情況,形式為一個包含 usersystem 屬性的物件,其值為微秒值(百萬分之一秒)。這些值分別測量在使用者程式碼和系統程式碼中花費的時間,如果多個 CPU 核心為此程序工作,最終可能會大於實際經過的時間。

可以將上一次呼叫 process.cpuUsage() 的結果作為引數傳遞給該函式,以獲得一個差異讀數。

import { cpuUsage } from 'node:process';

const startUsage = cpuUsage();
// { user: 38579, system: 6986 }

// spin the CPU for 500 milliseconds
const now = Date.now();
while (Date.now() - now < 500);

console.log(cpuUsage(startUsage));
// { user: 514883, system: 11226 }const { cpuUsage } = require('node:process');

const startUsage = cpuUsage();
// { user: 38579, system: 6986 }

// spin the CPU for 500 milliseconds
const now = Date.now();
while (Date.now() - now < 500);

console.log(cpuUsage(startUsage));
// { user: 514883, system: 11226 }

process.cwd()#

process.cwd() 方法返回 Node.js 程序的當前工作目錄。

import { cwd } from 'node:process';

console.log(`Current directory: ${cwd()}`);const { cwd } = require('node:process');

console.log(`Current directory: ${cwd()}`);

process.debugPort#

Node.js 偵錯程式啟用時使用的埠。

import process from 'node:process';

process.debugPort = 5858;const process = require('node:process');

process.debugPort = 5858;

process.disconnect()#

如果 Node.js 程序是使用 IPC 通道衍生的(請參閱子程序叢集文件),process.disconnect() 方法將關閉到父程序的 IPC 通道,從而允許子程序在沒有其他連線使其保持活動狀態時優雅地退出。

呼叫 process.disconnect() 的效果與從父程序呼叫 ChildProcess.disconnect() 相同。

如果 Node.js 程序不是使用 IPC 通道衍生的,process.disconnect() 將是 undefined

process.dlopen(module, filename[, flags])#

process.dlopen() 方法允許動態載入共享物件。它主要由 require() 用於載入 C++ 外掛,並且除非在特殊情況下,否則不應直接使用。換句話說,除非有特定原因,例如自定義 dlopen 標誌或從 ES 模組載入,否則應首選 require() 而不是 process.dlopen()

flags 引數是一個整數,允許指定 dlopen 的行為。有關詳細資訊,請參閱 os.constants.dlopen 文件。

呼叫 process.dlopen() 的一個重要要求是必須傳遞 module 例項。然後,C++ 外掛匯出的函式可以透過 module.exports 訪問。

下面的示例展示瞭如何載入一個名為 local.node 的 C++ 外掛,該外掛匯出一個 foo 函式。透過傳遞 RTLD_NOW 常量,所有符號在呼叫返回之前被載入。在這個例子中,假設該常量是可用的。

import { dlopen } from 'node:process';
import { constants } from 'node:os';
import { fileURLToPath } from 'node:url';

const module = { exports: {} };
dlopen(module, fileURLToPath(new URL('local.node', import.meta.url)),
       constants.dlopen.RTLD_NOW);
module.exports.foo();const { dlopen } = require('node:process');
const { constants } = require('node:os');
const { join } = require('node:path');

const module = { exports: {} };
dlopen(module, join(__dirname, 'local.node'), constants.dlopen.RTLD_NOW);
module.exports.foo();

process.emitWarning(warning[, options])#

  • warning <string> | <Error> 要發出的警告。
  • options <Object>
    • type <string>warningString 時,type 是用於發出的警告型別的名稱。預設: 'Warning'
    • code <string> 正在發出的警告例項的唯一識別符號。
    • ctor <Function>warningString 時,ctor 是一個可選函式,用於限制生成的堆疊跟蹤。預設: process.emitWarning
    • detail <string> 與錯誤一起包含的附加文字。

process.emitWarning() 方法可用於發出自定義或特定於應用程式的程序警告。可以透過向 'warning' 事件新增處理程式來監聽這些警告。

import { emitWarning } from 'node:process';

// Emit a warning with a code and additional detail.
emitWarning('Something happened!', {
  code: 'MY_WARNING',
  detail: 'This is some additional information',
});
// Emits:
// (node:56338) [MY_WARNING] Warning: Something happened!
// This is some additional informationconst { emitWarning } = require('node:process');

// Emit a warning with a code and additional detail.
emitWarning('Something happened!', {
  code: 'MY_WARNING',
  detail: 'This is some additional information',
});
// Emits:
// (node:56338) [MY_WARNING] Warning: Something happened!
// This is some additional information

在這個例子中,process.emitWarning() 內部生成一個 Error 物件,並將其傳遞給 'warning' 處理程式。

import process from 'node:process';

process.on('warning', (warning) => {
  console.warn(warning.name);    // 'Warning'
  console.warn(warning.message); // 'Something happened!'
  console.warn(warning.code);    // 'MY_WARNING'
  console.warn(warning.stack);   // Stack trace
  console.warn(warning.detail);  // 'This is some additional information'
});const process = require('node:process');

process.on('warning', (warning) => {
  console.warn(warning.name);    // 'Warning'
  console.warn(warning.message); // 'Something happened!'
  console.warn(warning.code);    // 'MY_WARNING'
  console.warn(warning.stack);   // Stack trace
  console.warn(warning.detail);  // 'This is some additional information'
});

如果 warning 作為 Error 物件傳遞,options 引數將被忽略。

process.emitWarning(warning[, type[, code]][, ctor])#

  • warning <string> | <Error> 要發出的警告。
  • type <string>warningString 時,type 是用於發出的警告型別的名稱。預設: 'Warning'
  • code <string> 正在發出的警告例項的唯一識別符號。
  • ctor <Function>warningString 時,ctor 是一個可選函式,用於限制生成的堆疊跟蹤。預設: process.emitWarning

process.emitWarning() 方法可用於發出自定義或特定於應用程式的程序警告。可以透過向 'warning' 事件新增處理程式來監聽這些警告。

import { emitWarning } from 'node:process';

// Emit a warning using a string.
emitWarning('Something happened!');
// Emits: (node: 56338) Warning: Something happened!const { emitWarning } = require('node:process');

// Emit a warning using a string.
emitWarning('Something happened!');
// Emits: (node: 56338) Warning: Something happened!
import { emitWarning } from 'node:process';

// Emit a warning using a string and a type.
emitWarning('Something Happened!', 'CustomWarning');
// Emits: (node:56338) CustomWarning: Something Happened!const { emitWarning } = require('node:process');

// Emit a warning using a string and a type.
emitWarning('Something Happened!', 'CustomWarning');
// Emits: (node:56338) CustomWarning: Something Happened!
import { emitWarning } from 'node:process';

emitWarning('Something happened!', 'CustomWarning', 'WARN001');
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!const { emitWarning } = require('node:process');

process.emitWarning('Something happened!', 'CustomWarning', 'WARN001');
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!

在前面的每個例子中,process.emitWarning() 內部都會生成一個 Error 物件,並將其傳遞給 'warning' 處理程式。

import process from 'node:process';

process.on('warning', (warning) => {
  console.warn(warning.name);
  console.warn(warning.message);
  console.warn(warning.code);
  console.warn(warning.stack);
});const process = require('node:process');

process.on('warning', (warning) => {
  console.warn(warning.name);
  console.warn(warning.message);
  console.warn(warning.code);
  console.warn(warning.stack);
});

如果 warning 是作為 Error 物件傳遞的,它將被原封不動地傳遞給 'warning' 事件處理程式(並且可選的 typecodector 引數將被忽略):

import { emitWarning } from 'node:process';

// Emit a warning using an Error object.
const myWarning = new Error('Something happened!');
// Use the Error name property to specify the type name
myWarning.name = 'CustomWarning';
myWarning.code = 'WARN001';

emitWarning(myWarning);
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!const { emitWarning } = require('node:process');

// Emit a warning using an Error object.
const myWarning = new Error('Something happened!');
// Use the Error name property to specify the type name
myWarning.name = 'CustomWarning';
myWarning.code = 'WARN001';

emitWarning(myWarning);
// Emits: (node:56338) [WARN001] CustomWarning: Something happened!

如果 warning 是除了字串或 Error 物件之外的任何東西,則會丟擲 TypeError

雖然程序警告使用 Error 物件,但程序警告機制並不是正常錯誤處理機制的替代品。

如果警告 type'DeprecationWarning',則會實現以下附加處理:

  • 如果使用了 --throw-deprecation 命令列標誌,棄用警告將被作為異常丟擲,而不是作為事件發出。
  • 如果使用了 --no-deprecation 命令列標誌,棄用警告將被抑制。
  • 如果使用了 --trace-deprecation 命令列標誌,棄用警告將與完整的堆疊跟蹤一起列印到 stderr

避免重複的警告#

作為最佳實踐,警告每個程序只應發出一次。為此,可以將 emitWarning() 放在一個布林值後面。

import { emitWarning } from 'node:process';

function emitMyWarning() {
  if (!emitMyWarning.warned) {
    emitMyWarning.warned = true;
    emitWarning('Only warn once!');
  }
}
emitMyWarning();
// Emits: (node: 56339) Warning: Only warn once!
emitMyWarning();
// Emits nothingconst { emitWarning } = require('node:process');

function emitMyWarning() {
  if (!emitMyWarning.warned) {
    emitMyWarning.warned = true;
    emitWarning('Only warn once!');
  }
}
emitMyWarning();
// Emits: (node: 56339) Warning: Only warn once!
emitMyWarning();
// Emits nothing

process.env#

process.env 屬性返回一個包含使用者環境的物件。參見 environ(7)

該物件的一個示例如下:

{
  TERM: 'xterm-256color',
  SHELL: '/usr/local/bin/bash',
  USER: 'maciej',
  PATH: '~/.bin/:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin',
  PWD: '/Users/maciej',
  EDITOR: 'vim',
  SHLVL: '1',
  HOME: '/Users/maciej',
  LOGNAME: 'maciej',
  _: '/usr/local/bin/node'
} 

可以修改這個物件,但這些修改不會反映到 Node.js 程序之外,或者(除非明確請求)反映到其他 Worker 執行緒。換句話說,以下示例將不起作用:

node -e 'process.env.foo = "bar"' && echo $foo 

而以下示例則可以:

import { env } from 'node:process';

env.foo = 'bar';
console.log(env.foo);const { env } = require('node:process');

env.foo = 'bar';
console.log(env.foo);

process.env 上分配屬性將隱式地將值轉換為字串。此行為已被棄用。未來版本的 Node.js 在值不是字串、數字或布林值時可能會丟擲錯誤。

import { env } from 'node:process';

env.test = null;
console.log(env.test);
// => 'null'
env.test = undefined;
console.log(env.test);
// => 'undefined'const { env } = require('node:process');

env.test = null;
console.log(env.test);
// => 'null'
env.test = undefined;
console.log(env.test);
// => 'undefined'

使用 deleteprocess.env 中刪除屬性。

import { env } from 'node:process';

env.TEST = 1;
delete env.TEST;
console.log(env.TEST);
// => undefinedconst { env } = require('node:process');

env.TEST = 1;
delete env.TEST;
console.log(env.TEST);
// => undefined

在 Windows 作業系統上,環境變數不區分大小寫。

import { env } from 'node:process';

env.TEST = 1;
console.log(env.test);
// => 1const { env } = require('node:process');

env.TEST = 1;
console.log(env.test);
// => 1

除非在建立 Worker 例項時明確指定,否則每個 Worker 執行緒都有其自己的 process.env 副本,該副本基於其父執行緒的 process.env,或者基於為 Worker 建構函式指定的 env 選項。對 process.env 的更改在 Worker 執行緒之間不可見,只有主執行緒可以進行對作業系統或原生外掛可見的更改。在 Windows 上,Worker 例項上的 process.env 副本以區分大小寫的方式操作,這與主執行緒不同。

process.execArgv#

process.execArgv 屬性返回在啟動 Node.js 程序時傳遞的一組特定於 Node.js 的命令列選項。這些選項不會出現在 process.argv 屬性返回的陣列中,並且不包括 Node.js 可執行檔案、指令碼名稱或指令碼名稱之後的任何選項。這些選項對於以與父程序相同的執行環境衍生子程序非常有用。

node --icu-data-dir=./foo --require ./bar.js script.js --version 

process.execArgv 的結果:

["--icu-data-dir=./foo", "--require", "./bar.js"] 

以及 process.argv 的結果:

['/usr/local/bin/node', 'script.js', '--version'] 

有關此屬性在工作執行緒中的詳細行為,請參閱 Worker 建構函式

process.execPath#

process.execPath 屬性返回啟動 Node.js 程序的可執行檔案的絕對路徑名。符號連結(如果有)會被解析。

'/usr/local/bin/node' 

process.execve(file[, args[, env]])#

穩定性:1 - 實驗性

  • file <string> 要執行的可執行檔案的名稱或路徑。
  • args <string[]> 字串引數列表。任何引數都不能包含空位元組(\u0000)。
  • env <Object> 環境變數鍵值對。任何鍵或值都不能包含空位元組(\u0000)。預設: process.env

用新程序替換當前程序。

這是透過使用 execve POSIX 函式實現的,因此除了標準輸入、標準輸出和標準錯誤檔案描述符外,當前程序的記憶體或其他資源都不會被保留。

所有其他資源在程序交換時都會被系統丟棄,不會觸發任何退出或關閉事件,也不會執行任何清理處理程式。

除非發生錯誤,否則此函式永遠不會返回。

此函式在 Windows 或 IBM i 上不可用。

process.exit([code])#

process.exit() 方法指示 Node.js 以 code 的退出狀態同步終止程序。如果省略 code,則退出使用“成功”程式碼 0process.exitCode 的值(如果已設定)。Node.js 在所有 'exit' 事件監聽器被呼叫之前不會終止。

以“失敗”程式碼退出:

import { exit } from 'node:process';

exit(1);const { exit } = require('node:process');

exit(1);

執行 Node.js 的 shell 應該看到退出碼為 1

呼叫 process.exit() 將強制程序儘快退出,即使仍有尚未完全完成的非同步操作在等待,包括對 process.stdoutprocess.stderr 的 I/O 操作。

在大多數情況下,實際上沒有必要顯式呼叫 process.exit()。如果事件迴圈中沒有額外的待處理工作,Node.js 程序將自行退出。可以設定 process.exitCode 屬性來告訴程序在正常退出時使用哪個退出碼。

例如,下面的例子說明了對 process.exit() 方法的誤用,這可能導致列印到 stdout 的資料被截斷和丟失:

import { exit } from 'node:process';

// This is an example of what *not* to do:
if (someConditionNotMet()) {
  printUsageToStdout();
  exit(1);
}const { exit } = require('node:process');

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

這個問題的原因在於,在 Node.js 中對 process.stdout 的寫入有時是非同步的,並且可能在 Node.js 事件迴圈的多個輪次中發生。然而,呼叫 process.exit() 會強制程序在這些額外的 stdout 寫入操作執行之前退出。

與其直接呼叫 process.exit(),程式碼應該設定 process.exitCode 並允許程序自然退出,方法是避免為事件迴圈排程任何額外的工作:

import process from 'node:process';

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exitCode = 1;
}const process = require('node:process');

// How to properly set the exit code while letting
// the process exit gracefully.
if (someConditionNotMet()) {
  printUsageToStdout();
  process.exitCode = 1;
}

如果由於錯誤條件需要終止 Node.js 程序,丟擲一個未捕獲的錯誤並允許程序相應地終止,比呼叫 process.exit() 更安全。

Worker 執行緒中,此函式會停止當前執行緒而不是當前程序。

process.exitCode#

當程序正常退出,或者透過 process.exit() 退出而未指定程式碼時,將作為程序退出碼的數字。

process.exitCode 的值可以透過給 process.exitCode 賦值或透過向 process.exit() 傳遞引數來更新:

$ node -e 'process.exitCode = 9'; echo $?
9
$ node -e 'process.exit(42)'; echo $?
42
$ node -e 'process.exitCode = 9; process.exit(42)'; echo $?
42 

當發生不可恢復的錯誤時(例如遇到未解決的頂層 await),Node.js 也會隱式設定該值。然而,對退出碼的顯式操作總是優先於隱式操作:

$ node --input-type=module -e 'await new Promise(() => {})'; echo $?
13
$ node --input-type=module -e 'process.exitCode = 9; await new Promise(() => {})'; echo $?
9 

process.features.cached_builtins#

一個布林值,如果當前的 Node.js 構建正在快取內建模組,則為 true

process.features.debug#

一個布林值,如果當前的 Node.js 構建是除錯構建,則為 true

process.features.inspector#

一個布林值,如果當前的 Node.js 構建包含檢查器,則為 true

process.features.ipv6#

穩定性:0 - 已棄用。此屬性始終為 true,任何基於它的檢查都是多餘的。

一個布林值,如果當前的 Node.js 構建包含對 IPv6 的支援,則為 true

由於所有 Node.js 構建都支援 IPv6,因此該值始終為 true

process.features.require_module#

一個布林值,如果當前的 Node.js 構建支援使用 require() 載入 ECMAScript 模組,則為 true

process.features.tls#

一個布林值,如果當前的 Node.js 構建包含對 TLS 的支援,則為 true

process.features.tls_alpn#

穩定性:0 - 已棄用。請改用 process.features.tls

一個布林值,如果當前的 Node.js 構建包含對 TLS 中 ALPN 的支援,則為 true

在 Node.js 11.0.0 及更高版本中,OpenSSL 依賴項具有無條件的 ALPN 支援。因此,該值與 process.features.tls 的值相同。

process.features.tls_ocsp#

穩定性:0 - 已棄用。請改用 process.features.tls

一個布林值,如果當前的 Node.js 構建包含對 TLS 中 OCSP 的支援,則為 true

在 Node.js 11.0.0 及更高版本中,OpenSSL 依賴項具有無條件的 OCSP 支援。因此,該值與 process.features.tls 的值相同。

process.features.tls_sni#

穩定性:0 - 已棄用。請改用 process.features.tls

一個布林值,如果當前的 Node.js 構建包含對 TLS 中 SNI 的支援,則為 true

在 Node.js 11.0.0 及更高版本中,OpenSSL 依賴項具有無條件的 SNI 支援。因此,該值與 process.features.tls 的值相同。

process.features.typescript#

穩定性:1.2 - 候選釋出

一個值,預設情況下為 "strip",如果 Node.js 使用 --experimental-transform-types 執行,則為 "transform",如果 Node.js 使用 --no-experimental-strip-types 執行,則為 false

process.features.uv#

穩定性:0 - 已棄用。此屬性始終為 true,任何基於它的檢查都是多餘的。

一個布林值,如果當前的 Node.js 構建包含對 libuv 的支援,則為 true

由於不可能在沒有 libuv 的情況下構建 Node.js,因此該值始終為 true

process.finalization.register(ref, callback)#

穩定性:1.1 - 活躍開發

此函式註冊一個回撥,如果 ref 物件未被垃圾回收,當程序發出 exit 事件時將被呼叫。如果 ref 物件在發出 exit 事件之前被垃圾回收,回撥將從終結登錄檔中移除,並且在程序退出時不會被呼叫。

在回撥函式內部,您可以釋放由 ref 物件分配的資源。請注意,應用於 beforeExit 事件的所有限制也適用於 callback 函式,這意味著在特殊情況下,回撥可能不會被呼叫。

這個函式的想法是幫助您在程序開始退出時釋放資源,但如果物件不再被使用,也讓其被垃圾回收。

例如:您可以註冊一個包含緩衝區的物件,您想確保在程序退出時該緩衝區被釋放,但如果該物件在程序退出前被垃圾回收,我們就不再需要釋放該緩衝區了,所以在這種情況下,我們只需從終結登錄檔中移除回撥即可。

const { finalization } = require('node:process');

// Please make sure that the function passed to finalization.register()
// does not create a closure around unnecessary objects.
function onFinalize(obj, event) {
  // You can do whatever you want with the object
  obj.dispose();
}

function setup() {
  // This object can be safely garbage collected,
  // and the resulting shutdown function will not be called.
  // There are no leaks.
  const myDisposableObject = {
    dispose() {
      // Free your resources synchronously
    },
  };

  finalization.register(myDisposableObject, onFinalize);
}

setup();import { finalization } from 'node:process';

// Please make sure that the function passed to finalization.register()
// does not create a closure around unnecessary objects.
function onFinalize(obj, event) {
  // You can do whatever you want with the object
  obj.dispose();
}

function setup() {
  // This object can be safely garbage collected,
  // and the resulting shutdown function will not be called.
  // There are no leaks.
  const myDisposableObject = {
    dispose() {
      // Free your resources synchronously
    },
  };

  finalization.register(myDisposableObject, onFinalize);
}

setup();

上面的程式碼依賴於以下假設:

  • 避免使用箭頭函式
  • 建議常規函式在全域性上下文(根)內

常規函式可能引用 obj 所在的上下文,導致 obj 無法被垃圾回收。

箭頭函式將持有先前的上下文。例如,考慮:

class Test {
  constructor() {
    finalization.register(this, (ref) => ref.dispose());

    // Even something like this is highly discouraged
    // finalization.register(this, () => this.dispose());
  }
  dispose() {}
} 

這個物件被垃圾回收的可能性很小(但不是不可能),但如果它沒有被垃圾回收,dispose 將在呼叫 process.exit 時被呼叫。

請小心,避免依賴此功能來處理關鍵資源的釋放,因為不保證在所有情況下都會呼叫回撥。

process.finalization.registerBeforeExit(ref, callback)#

穩定性:1.1 - 活躍開發

此函式的行為與 register 完全相同,只是如果 ref 物件未被垃圾回收,當程序發出 beforeExit 事件時,回撥將被呼叫。

請注意,應用於 beforeExit 事件的所有限制也適用於 callback 函式,這意味著在特殊情況下,回撥可能不會被呼叫。

process.finalization.unregister(ref)#

穩定性:1.1 - 活躍開發

此函式從終結登錄檔中移除物件的註冊,因此回撥將不再被呼叫。

const { finalization } = require('node:process');

// Please make sure that the function passed to finalization.register()
// does not create a closure around unnecessary objects.
function onFinalize(obj, event) {
  // You can do whatever you want with the object
  obj.dispose();
}

function setup() {
  // This object can be safely garbage collected,
  // and the resulting shutdown function will not be called.
  // There are no leaks.
  const myDisposableObject = {
    dispose() {
      // Free your resources synchronously
    },
  };

  finalization.register(myDisposableObject, onFinalize);

  // Do something

  myDisposableObject.dispose();
  finalization.unregister(myDisposableObject);
}

setup();import { finalization } from 'node:process';

// Please make sure that the function passed to finalization.register()
// does not create a closure around unnecessary objects.
function onFinalize(obj, event) {
  // You can do whatever you want with the object
  obj.dispose();
}

function setup() {
  // This object can be safely garbage collected,
  // and the resulting shutdown function will not be called.
  // There are no leaks.
  const myDisposableObject = {
    dispose() {
      // Free your resources synchronously
    },
  };

  // Please make sure that the function passed to finalization.register()
  // does not create a closure around unnecessary objects.
  function onFinalize(obj, event) {
    // You can do whatever you want with the object
    obj.dispose();
  }

  finalization.register(myDisposableObject, onFinalize);

  // Do something

  myDisposableObject.dispose();
  finalization.unregister(myDisposableObject);
}

setup();

process.getActiveResourcesInfo()#

process.getActiveResourcesInfo() 方法返回一個字串陣列,其中包含當前使事件迴圈保持活動的活動資源的型別。

import { getActiveResourcesInfo } from 'node:process';
import { setTimeout } from 'node:timers';

console.log('Before:', getActiveResourcesInfo());
setTimeout(() => {}, 1000);
console.log('After:', getActiveResourcesInfo());
// Prints:
//   Before: [ 'CloseReq', 'TTYWrap', 'TTYWrap', 'TTYWrap' ]
//   After: [ 'CloseReq', 'TTYWrap', 'TTYWrap', 'TTYWrap', 'Timeout' ]const { getActiveResourcesInfo } = require('node:process');
const { setTimeout } = require('node:timers');

console.log('Before:', getActiveResourcesInfo());
setTimeout(() => {}, 1000);
console.log('After:', getActiveResourcesInfo());
// Prints:
//   Before: [ 'TTYWrap', 'TTYWrap', 'TTYWrap' ]
//   After: [ 'TTYWrap', 'TTYWrap', 'TTYWrap', 'Timeout' ]

process.getBuiltinModule(id)#

process.getBuiltinModule(id) 提供了一種在全域性可用函式中載入內建模組的方法。需要支援其他環境的 ES 模組可以使用它在 Node.js 中執行時有條件地載入 Node.js 內建模組,而無需處理在非 Node.js 環境中 import 可能丟擲的解析錯誤,也無需使用動態 import(),後者要麼將模組變成非同步模組,要麼將同步 API 變成非同步 API。

if (globalThis.process?.getBuiltinModule) {
  // Run in Node.js, use the Node.js fs module.
  const fs = globalThis.process.getBuiltinModule('fs');
  // If `require()` is needed to load user-modules, use createRequire()
  const module = globalThis.process.getBuiltinModule('module');
  const require = module.createRequire(import.meta.url);
  const foo = require('foo');
} 

如果 id 指定了當前 Node.js 程序中可用的內建模組,process.getBuiltinModule(id) 方法將返回相應的內建模組。如果 id 不對應任何內建模組,則返回 undefined

process.getBuiltinModule(id) 接受 module.isBuiltin(id) 識別的內建模組 ID。一些內建模組必須使用 node: 字首載入,請參閱具有強制性 node: 字首的內建模組。即使使用者修改了 require.cache 使得 require(id) 返回其他內容,process.getBuiltinModule(id) 返回的引用也總是指向與 id 對應的內建模組。

process.getegid()#

process.getegid() 方法返回 Node.js 程序的數字有效組標識。(參見 getegid(2).)

import process from 'node:process';

if (process.getegid) {
  console.log(`Current gid: ${process.getegid()}`);
}const process = require('node:process');

if (process.getegid) {
  console.log(`Current gid: ${process.getegid()}`);
}

此功能僅在 POSIX 平臺(即非 Windows 或 Android)上可用。

process.geteuid()#

process.geteuid() 方法返回程序的數字有效使用者身份。(參見 geteuid(2).)

import process from 'node:process';

if (process.geteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
}const process = require('node:process');

if (process.geteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
}

此功能僅在 POSIX 平臺(即非 Windows 或 Android)上可用。

process.getgid()#

process.getgid() 方法返回程序的數字組標識。(參見 getgid(2).)

import process from 'node:process';

if (process.getgid) {
  console.log(`Current gid: ${process.getgid()}`);
}const process = require('node:process');

if (process.getgid) {
  console.log(`Current gid: ${process.getgid()}`);
}

此功能僅在 POSIX 平臺(即非 Windows 或 Android)上可用。

process.getgroups()#

process.getgroups() 方法返回一個包含補充組 ID 的陣列。POSIX 未指定是否包含有效組 ID,但 Node.js 確保始終包含。

import process from 'node:process';

if (process.getgroups) {
  console.log(process.getgroups()); // [ 16, 21, 297 ]
}const process = require('node:process');

if (process.getgroups) {
  console.log(process.getgroups()); // [ 16, 21, 297 ]
}

此功能僅在 POSIX 平臺(即非 Windows 或 Android)上可用。

process.getuid()#

process.getuid() 方法返回程序的數字使用者身份。(參見 getuid(2).)

import process from 'node:process';

if (process.getuid) {
  console.log(`Current uid: ${process.getuid()}`);
}const process = require('node:process');

if (process.getuid) {
  console.log(`Current uid: ${process.getuid()}`);
}

此功能在 Windows 上不可用。

process.hasUncaughtExceptionCaptureCallback()#

指示是否已使用 process.setUncaughtExceptionCaptureCallback() 設定了回撥。

process.hrtime([time])#

穩定性:3 - 遺留。請改用 process.hrtime.bigint()

這是在 JavaScript 中引入 bigint 之前 process.hrtime.bigint() 的舊版。

process.hrtime() 方法以 [秒, 納秒] 元組 Array 的形式返回當前的高精度即時時間,其中 nanoseconds 是無法以秒精度表示的即時時間的剩餘部分。

time 是一個可選引數,必須是上一次 process.hrtime() 呼叫的結果,用於與當前時間進行比較。如果傳入的引數不是一個元組 Array,將會丟擲 TypeError。傳入使用者定義的陣列而不是上一次 process.hrtime() 呼叫的結果,將導致未定義的行為。

這些時間是相對於過去的某個任意時間點,與一天中的時間無關,因此不受時鐘漂移的影響。其主要用途是測量時間間隔之間的效能。

import { hrtime } from 'node:process';

const NS_PER_SEC = 1e9;
const time = hrtime();
// [ 1800216, 25 ]

setTimeout(() => {
  const diff = hrtime(time);
  // [ 1, 552 ]

  console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`);
  // Benchmark took 1000000552 nanoseconds
}, 1000);const { hrtime } = require('node:process');

const NS_PER_SEC = 1e9;
const time = hrtime();
// [ 1800216, 25 ]

setTimeout(() => {
  const diff = hrtime(time);
  // [ 1, 552 ]

  console.log(`Benchmark took ${diff[0] * NS_PER_SEC + diff[1]} nanoseconds`);
  // Benchmark took 1000000552 nanoseconds
}, 1000);

process.hrtime.bigint()#

process.hrtime() 方法的 bigint 版本,以 bigint 形式返回當前的高精度即時時間(單位為納秒)。

process.hrtime() 不同,它不支援額外的 time 引數,因為可以直接透過兩個 bigint 相減來計算差值。

import { hrtime } from 'node:process';

const start = hrtime.bigint();
// 191051479007711n

setTimeout(() => {
  const end = hrtime.bigint();
  // 191052633396993n

  console.log(`Benchmark took ${end - start} nanoseconds`);
  // Benchmark took 1154389282 nanoseconds
}, 1000);const { hrtime } = require('node:process');

const start = hrtime.bigint();
// 191051479007711n

setTimeout(() => {
  const end = hrtime.bigint();
  // 191052633396993n

  console.log(`Benchmark took ${end - start} nanoseconds`);
  // Benchmark took 1154389282 nanoseconds
}, 1000);

process.initgroups(user, extraGroup)#

process.initgroups() 方法讀取 /etc/group 檔案並初始化組訪問列表,使用該使用者所屬的所有組。這是一個特權操作,要求 Node.js 程序具有 root 訪問許可權或 CAP_SETGID 能力。

在放棄許可權時要小心。

import { getgroups, initgroups, setgid } from 'node:process';

console.log(getgroups());         // [ 0 ]
initgroups('nodeuser', 1000);     // switch user
console.log(getgroups());         // [ 27, 30, 46, 1000, 0 ]
setgid(1000);                     // drop root gid
console.log(getgroups());         // [ 27, 30, 46, 1000 ]const { getgroups, initgroups, setgid } = require('node:process');

console.log(getgroups());         // [ 0 ]
initgroups('nodeuser', 1000);     // switch user
console.log(getgroups());         // [ 27, 30, 46, 1000, 0 ]
setgid(1000);                     // drop root gid
console.log(getgroups());         // [ 27, 30, 46, 1000 ]

此函式僅在 POSIX 平臺(即非 Windows 或 Android)上可用。此功能在 Worker 執行緒中不可用。

process.kill(pid[, signal])#

  • pid <number> 程序 ID
  • signal <string> | <number> 要傳送的訊號,可以是字串或數字。預設值: 'SIGTERM'

process.kill() 方法將 signal 傳送給由 pid 標識的程序。

訊號名稱是諸如 'SIGINT''SIGHUP' 之類的字串。有關更多資訊,請參見訊號事件kill(2)

如果目標 pid 不存在,此方法將丟擲錯誤。作為特例,訊號 0 可用於測試程序是否存在。在 Windows 平臺上,如果使用 pid 來終止一個程序組,將會丟擲錯誤。

儘管此函式的名稱是 process.kill(),但它實際上只是一個訊號傳送器,就像 kill 系統呼叫一樣。傳送的訊號可能執行的操作不只是終止目標程序。

import process, { kill } from 'node:process';

process.on('SIGHUP', () => {
  console.log('Got SIGHUP signal.');
});

setTimeout(() => {
  console.log('Exiting.');
  process.exit(0);
}, 100);

kill(process.pid, 'SIGHUP');const process = require('node:process');

process.on('SIGHUP', () => {
  console.log('Got SIGHUP signal.');
});

setTimeout(() => {
  console.log('Exiting.');
  process.exit(0);
}, 100);

process.kill(process.pid, 'SIGHUP');

當 Node.js 程序接收到 SIGUSR1 時,Node.js 將啟動偵錯程式。請參見訊號事件

process.loadEnvFile(path)#

.env 檔案載入到 process.env 中。在 .env 檔案中使用 NODE_OPTIONS 對 Node.js 不會產生任何影響。

const { loadEnvFile } = require('node:process');
loadEnvFile();import { loadEnvFile } from 'node:process';
loadEnvFile();

process.mainModule#

穩定性:0 - 已棄用:請改用 require.main

process.mainModule 屬性提供了另一種檢索 require.main 的方法。區別在於,如果主模組在執行時發生變化,require.main 在那些變化發生前被引入的模組中,可能仍然指向原始的主模組。通常可以安全地假設兩者指向同一個模組。

require.main 一樣,如果沒有入口指令碼,process.mainModule 將為 undefined

process.memoryUsage()#

返回一個描述 Node.js 程序記憶體使用情況的物件,單位為位元組。

import { memoryUsage } from 'node:process';

console.log(memoryUsage());
// Prints:
// {
//  rss: 4935680,
//  heapTotal: 1826816,
//  heapUsed: 650472,
//  external: 49879,
//  arrayBuffers: 9386
// }const { memoryUsage } = require('node:process');

console.log(memoryUsage());
// Prints:
// {
//  rss: 4935680,
//  heapTotal: 1826816,
//  heapUsed: 650472,
//  external: 49879,
//  arrayBuffers: 9386
// }
  • heapTotalheapUsed 指的是 V8 的記憶體使用情況。
  • external 指的是繫結到由 V8 管理的 JavaScript 物件的 C++ 物件的記憶體使用情況。
  • rss,即駐留集大小(Resident Set Size),是程序在主記憶體裝置中佔用的空間量(是總分配記憶體的子集),包括所有 C++ 和 JavaScript 物件及程式碼。
  • arrayBuffers 指的是為 ArrayBufferSharedArrayBuffer 分配的記憶體,包括所有的 Node.js Buffer。這部分也包含在 external 值中。當 Node.js 作為嵌入式庫使用時,此值可能為 0,因為在這種情況下可能不會跟蹤 ArrayBuffer 的分配。

當使用 Worker 執行緒時,rss 將是適用於整個程序的值,而其他欄位僅指當前執行緒。

process.memoryUsage() 方法會遍歷每個頁面以收集有關記憶體使用的資訊,這可能會根據程式的記憶體分配情況而變慢。

關於 process.memoryUsage 的注意事項#

在 Linux 或其他通常使用 glibc 的系統上,儘管 heapTotal 穩定,但由於 glibc malloc 實現引起的碎片化,應用程式可能會出現持續的 rss 增長。請參見 nodejs/node#21973 瞭解如何切換到備用 malloc 實現以解決此效能問題。

process.memoryUsage.rss()#

process.memoryUsage.rss() 方法返回一個表示駐留集大小(RSS)的整數,單位為位元組。

駐留集大小是程序在主記憶體裝置中佔用的空間量(是總分配記憶體的子集),包括所有 C++ 和 JavaScript 物件及程式碼。

這與 process.memoryUsage() 提供的 rss 屬性的值相同,但 process.memoryUsage.rss() 更快。

import { memoryUsage } from 'node:process';

console.log(memoryUsage.rss());
// 35655680const { memoryUsage } = require('node:process');

console.log(memoryUsage.rss());
// 35655680

process.nextTick(callback[, ...args])#

穩定性:3 - 遺留:請改用 queueMicrotask()

  • callback <Function>
  • ...args <any> 呼叫 callback 時傳遞的額外引數。

process.nextTick()callback 新增到“next tick 佇列”。此佇列在 JavaScript 棧上的當前操作執行完成後、事件迴圈被允許繼續之前完全清空。如果遞迴呼叫 process.nextTick(),可能會建立一個無限迴圈。有關更多背景資訊,請參見事件迴圈指南。

import { nextTick } from 'node:process';

console.log('start');
nextTick(() => {
  console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callbackconst { nextTick } = require('node:process');

console.log('start');
nextTick(() => {
  console.log('nextTick callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// nextTick callback

這在開發 API 時非常重要,以便在物件被構造之後、任何 I/O 發生之前,給使用者機會分配事件處理程式。

import { nextTick } from 'node:process';

function MyThing(options) {
  this.setupOptions(options);

  nextTick(() => {
    this.startDoingStuff();
  });
}

const thing = new MyThing();
thing.getReadyForStuff();

// thing.startDoingStuff() gets called now, not before.const { nextTick } = require('node:process');

function MyThing(options) {
  this.setupOptions(options);

  nextTick(() => {
    this.startDoingStuff();
  });
}

const thing = new MyThing();
thing.getReadyForStuff();

// thing.startDoingStuff() gets called now, not before.

對於 API 來說,要麼 100% 同步,要麼 100% 非同步,這是非常重要的。考慮這個例子:

// WARNING!  DO NOT USE!  BAD UNSAFE HAZARD!
function maybeSync(arg, cb) {
  if (arg) {
    cb();
    return;
  }

  fs.stat('file', cb);
} 

這個 API 是危險的,因為在以下情況下:

const maybeTrue = Math.random() > 0.5;

maybeSync(maybeTrue, () => {
  foo();
});

bar(); 

不清楚是 foo() 還是 bar() 會先被呼叫。

以下方法要好得多:

import { nextTick } from 'node:process';

function definitelyAsync(arg, cb) {
  if (arg) {
    nextTick(cb);
    return;
  }

  fs.stat('file', cb);
}const { nextTick } = require('node:process');

function definitelyAsync(arg, cb) {
  if (arg) {
    nextTick(cb);
    return;
  }

  fs.stat('file', cb);
}

何時使用 queueMicrotask()process.nextTick()#

queueMicrotask() API 是 process.nextTick() 的一個替代方案,它不使用“next tick 佇列”,而是使用與執行已解析 promise 的 then、catch 和 finally 處理程式相同的微任務佇列來延遲函式的執行。

在 Node.js 內部,每當“next tick 佇列”被清空時,微任務佇列會緊接著被清空。

因此,在 CJS 模組中,process.nextTick() 回撥總是在 queueMicrotask() 回撥之前執行。然而,由於 ESM 模組本身就是作為微任務佇列的一部分處理的,因此在 ESM 模組中,queueMicrotask() 回撥總是在 process.nextTick() 回撥之前執行,因為此時 Node.js 已經在處理微任務佇列。

import { nextTick } from 'node:process';

Promise.resolve().then(() => console.log('resolve'));
queueMicrotask(() => console.log('microtask'));
nextTick(() => console.log('nextTick'));
// Output:
// resolve
// microtask
// nextTickconst { nextTick } = require('node:process');

Promise.resolve().then(() => console.log('resolve'));
queueMicrotask(() => console.log('microtask'));
nextTick(() => console.log('nextTick'));
// Output:
// nextTick
// resolve
// microtask

對於大多數使用者空間的用例,queueMicrotask() API 提供了一種可移植且可靠的延遲執行機制,它在多個 JavaScript 平臺環境中都有效,應優先於 process.nextTick() 使用。在簡單場景中,queueMicrotask() 可以作為 process.nextTick() 的直接替代品。

console.log('start');
queueMicrotask(() => {
  console.log('microtask callback');
});
console.log('scheduled');
// Output:
// start
// scheduled
// microtask callback 

這兩個 API 之間一個值得注意的區別是,process.nextTick() 允許指定額外的引數,這些引數將在呼叫延遲函式時作為引數傳遞。要用 queueMicrotask() 實現同樣的效果,需要使用閉包或繫結函式:

function deferred(a, b) {
  console.log('microtask', a + b);
}

console.log('start');
queueMicrotask(deferred.bind(undefined, 1, 2));
console.log('scheduled');
// Output:
// start
// scheduled
// microtask 3 

在處理從 next tick 佇列和微任務佇列內部丟擲的錯誤方面存在細微差異。在排隊的微任務回撥中丟擲的錯誤應儘可能在該回調內部處理。如果未能處理,可以使用 process.on('uncaughtException') 事件處理程式來捕獲和處理這些錯誤。

如有疑問,除非需要 process.nextTick() 的特定功能,否則請使用 queueMicrotask()

process.noDeprecation#

process.noDeprecation 屬性指示當前 Node.js 程序是否設定了 --no-deprecation 標誌。有關此標誌行為的更多資訊,請參閱 'warning' 事件emitWarning() 方法的文件。

process.permission#

此 API 可透過 --permission 標誌使用。

process.permission 是一個物件,其方法用於管理當前程序的許可權。更多文件可在許可權模型中找到。

process.permission.has(scope[, reference])#

驗證程序是否能夠訪問給定的範圍和引用。如果未提供引用,則假定為全域性範圍,例如,process.permission.has('fs.read') 將檢查程序是否擁有所有檔案系統的讀取許可權。

引用(reference)的含義基於提供的範圍(scope)。例如,當範圍是檔案系統時,引用指的是檔案和資料夾。

可用的範圍有:

  • fs - 所有檔案系統
  • fs.read - 檔案系統讀取操作
  • fs.write - 檔案系統寫入操作
  • child - 子程序生成操作
  • worker - 工作執行緒生成操作
// Check if the process has permission to read the README file
process.permission.has('fs.read', './README.md');
// Check if the process has read permission operations
process.permission.has('fs.read'); 

process.pid#

process.pid 屬性返回程序的 PID。

import { pid } from 'node:process';

console.log(`This process is pid ${pid}`);const { pid } = require('node:process');

console.log(`This process is pid ${pid}`);

process.platform#

process.platform 屬性返回一個字串,標識編譯 Node.js 二進位制檔案時所針對的作業系統平臺。

當前可能的值有:

  • 'aix'
  • 'darwin'
  • 'freebsd'
  • 'linux'
  • 'openbsd'
  • 'sunos'
  • 'win32'
import { platform } from 'node:process';

console.log(`This platform is ${platform}`);const { platform } = require('node:process');

console.log(`This platform is ${platform}`);

如果 Node.js 是在 Android 作業系統上構建的,也可能返回值 'android'。然而,Node.js 對 Android 的支援是實驗性的

process.ppid#

process.ppid 屬性返回當前程序的父程序的 PID。

import { ppid } from 'node:process';

console.log(`The parent process is pid ${ppid}`);const { ppid } = require('node:process');

console.log(`The parent process is pid ${ppid}`);

process.ref(maybeRefable)#

穩定性:1 - 實驗性

  • maybeRefable <any> 一個可能是“可引用”的物件。

一個物件是“可引用的”,如果它實現了 Node.js 的“Refable 協議”。具體來說,這意味著該物件實現了 Symbol.for('nodejs.ref')Symbol.for('nodejs.unref') 方法。被“引用”(Ref'd)的物件將使 Node.js 事件迴圈保持活動狀態,而被“取消引用”(unref'd)的物件則不會。歷史上,這是透過直接在物件上使用 ref()unref() 方法來實現的。然而,這種模式正在被棄用,以支援“Refable 協議”,以便更好地支援 Web 平臺 API 型別,這些型別的 API 無法修改以新增 ref()unref() 方法,但仍需支援該行為。

process.release#

process.release 屬性返回一個包含與當前釋出版本相關的元資料的 Object,包括原始碼 tarball 和僅標頭檔案的 tarball 的 URL。

process.release 包含以下屬性:

  • name <string> 一個始終為 'node' 的值。
  • sourceUrl <string> 一個指向包含當前釋出版本原始碼的 .tar.gz 檔案的絕對 URL。
  • headersUrl<string> 一個指向僅包含當前釋出版本源標頭檔案的 .tar.gz 檔案的絕對 URL。此檔案比完整原始檔小得多,可用於編譯 Node.js 原生外掛。
  • libUrl <string> | <undefined> 一個指向與當前釋出版本的架構和版本匹配的 node.lib 檔案的絕對 URL。此檔案用於編譯 Node.js 原生外掛。此屬性僅存在於 Node.js 的 Windows 構建版本中,在所有其他平臺上都將缺失。
  • lts <string> | <undefined> 一個標識此版本 LTS 標籤的字串。此屬性僅存在於 LTS 版本中,對於所有其他釋出型別(包括當前版本)均為 undefined。有效值包括 LTS 釋出代號(包括那些不再受支援的)。
    • 對於從 14.15.0 開始的 14.x LTS 系列,為 'Fermium'
    • 對於從 16.13.0 開始的 16.x LTS 系列,為 'Gallium'
    • 對於從 18.12.0 開始的 18.x LTS 系列,為 'Hydrogen'。對於其他 LTS 釋出代號,請參見 Node.js 更新日誌歸檔
{
  name: 'node',
  lts: 'Hydrogen',
  sourceUrl: 'https://nodejs.com.tw/download/release/v18.12.0/node-v18.12.0.tar.gz',
  headersUrl: 'https://nodejs.com.tw/download/release/v18.12.0/node-v18.12.0-headers.tar.gz',
  libUrl: 'https://nodejs.com.tw/download/release/v18.12.0/win-x64/node.lib'
} 

在從非釋出版本的原始碼樹進行的自定義構建中,可能只存在 name 屬性。不應依賴其他屬性的存在。

process.report#

process.report 是一個物件,其方法用於為當前程序生成診斷報告。更多文件可在報告文件中找到。

process.report.compact#

以緊湊格式寫入報告,即單行 JSON,比專為人類閱讀設計的預設多行格式更容易被日誌處理系統使用。

import { report } from 'node:process';

console.log(`Reports are compact? ${report.compact}`);const { report } = require('node:process');

console.log(`Reports are compact? ${report.compact}`);

process.report.directory#

報告寫入的目錄。預設值為空字串,表示報告將寫入 Node.js 程序的當前工作目錄。

import { report } from 'node:process';

console.log(`Report directory is ${report.directory}`);const { report } = require('node:process');

console.log(`Report directory is ${report.directory}`);

process.report.filename#

報告寫入的檔名。如果設定為空字串,輸出檔名將由時間戳、PID 和序列號組成。預設值為空字串。

如果 process.report.filename 的值設定為 'stdout''stderr',報告將分別寫入程序的標準輸出或標準錯誤。

import { report } from 'node:process';

console.log(`Report filename is ${report.filename}`);const { report } = require('node:process');

console.log(`Report filename is ${report.filename}`);

process.report.getReport([err])#

  • err <Error> 一個自定義錯誤,用於報告 JavaScript 堆疊。
  • 返回:<Object>

返回一個正在執行程序的診斷報告的 JavaScript 物件表示。報告的 JavaScript 堆疊跟蹤取自 err(如果存在)。

import { report } from 'node:process';
import util from 'node:util';

const data = report.getReport();
console.log(data.header.nodejsVersion);

// Similar to process.report.writeReport()
import fs from 'node:fs';
fs.writeFileSync('my-report.log', util.inspect(data), 'utf8');const { report } = require('node:process');
const util = require('node:util');

const data = report.getReport();
console.log(data.header.nodejsVersion);

// Similar to process.report.writeReport()
const fs = require('node:fs');
fs.writeFileSync('my-report.log', util.inspect(data), 'utf8');

更多文件可在報告文件中找到。

process.report.reportOnFatalError#

如果為 true,則在發生致命錯誤時生成診斷報告,例如記憶體不足錯誤或失敗的 C++ 斷言。

import { report } from 'node:process';

console.log(`Report on fatal error: ${report.reportOnFatalError}`);const { report } = require('node:process');

console.log(`Report on fatal error: ${report.reportOnFatalError}`);

process.report.reportOnSignal#

如果為 true,則當程序收到由 process.report.signal 指定的訊號時生成診斷報告。

import { report } from 'node:process';

console.log(`Report on signal: ${report.reportOnSignal}`);const { report } = require('node:process');

console.log(`Report on signal: ${report.reportOnSignal}`);

process.report.reportOnUncaughtException#

如果為 true,則在未捕獲的異常上生成診斷報告。

import { report } from 'node:process';

console.log(`Report on exception: ${report.reportOnUncaughtException}`);const { report } = require('node:process');

console.log(`Report on exception: ${report.reportOnUncaughtException}`);

process.report.excludeEnv#

如果為 true,則生成的診斷報告中將不包含環境變數。

process.report.signal#

用於觸發建立診斷報告的訊號。預設為 'SIGUSR2'

import { report } from 'node:process';

console.log(`Report signal: ${report.signal}`);const { report } = require('node:process');

console.log(`Report signal: ${report.signal}`);

process.report.writeReport([filename][, err])#

  • filename <string> 報告寫入的檔名。這應該是一個相對路徑,它將被附加到 process.report.directory 中指定的目錄,如果未指定,則為 Node.js 程序的當前工作目錄。

  • err <Error> 一個自定義錯誤,用於報告 JavaScript 堆疊。

  • 返回: <string> 返回生成的報告的檔名。

將診斷報告寫入檔案。如果未提供 filename,預設檔名將包括日期、時間、PID 和一個序列號。報告的 JavaScript 堆疊跟蹤取自 err(如果存在)。

如果 filename 的值設定為 'stdout''stderr',報告將分別寫入程序的標準輸出或標準錯誤。

import { report } from 'node:process';

report.writeReport();const { report } = require('node:process');

report.writeReport();

更多文件可在報告文件中找到。

process.resourceUsage()#

  • 返回:<Object> 當前程序的資源使用情況。所有這些值都來自 uv_getrusage 呼叫,該呼叫返回一個 uv_rusage_t 結構
    • userCPUTime <integer> 對映到以微秒計算的 ru_utime。它與 process.cpuUsage().user 的值相同。
    • systemCPUTime <integer> 對映到以微秒計算的 ru_stime。它與 process.cpuUsage().system 的值相同。
    • maxRSS <integer> 對映到 ru_maxrss,這是以 kibibytes (1024 位元組) 為單位使用的最大駐留集大小。
    • sharedMemorySize <integer> 對映到 ru_ixrss,但任何平臺都不支援。
    • unsharedDataSize <integer> 對映到 ru_idrss,但任何平臺都不支援。
    • unsharedStackSize <integer> 對映到 ru_isrss,但任何平臺都不支援。
    • minorPageFault <integer> 對映到 ru_minflt,這是程序的次要頁面錯誤的數量,更多詳細資訊請參閱這篇文章
    • majorPageFault <integer> 對映到 ru_majflt,這是程序的主要頁面錯誤的數量,更多詳細資訊請參閱這篇文章。此欄位在 Windows 上不受支援。
    • swappedOut <integer> 對映到 ru_nswap,但任何平臺都不支援。
    • fsRead <integer> 對映到 ru_inblock,這是檔案系統必須執行輸入的次數。
    • fsWrite <integer> 對映到 ru_oublock,這是檔案系統必須執行輸出的次數。
    • ipcSent <integer> 對映到 ru_msgsnd,但任何平臺都不支援。
    • ipcReceived <integer> 對映到 ru_msgrcv,但任何平臺都不支援。
    • signalsCount <integer> 對映到 ru_nsignals,但任何平臺都不支援。
    • voluntaryContextSwitches <integer> 對映到 ru_nvcsw,這是由於程序在其時間片完成前自願放棄處理器(通常是為了等待資源可用)而導致的 CPU 上下文切換次數。此欄位在 Windows 上不受支援。
    • involuntaryContextSwitches <integer> 對映到 ru_nivcsw,這是由於更高優先順序的程序變為可執行或當前程序超出了其時間片而導致的 CPU 上下文切換次數。此欄位在 Windows 上不受支援。
import { resourceUsage } from 'node:process';

console.log(resourceUsage());
/*
  Will output:
  {
    userCPUTime: 82872,
    systemCPUTime: 4143,
    maxRSS: 33164,
    sharedMemorySize: 0,
    unsharedDataSize: 0,
    unsharedStackSize: 0,
    minorPageFault: 2469,
    majorPageFault: 0,
    swappedOut: 0,
    fsRead: 0,
    fsWrite: 8,
    ipcSent: 0,
    ipcReceived: 0,
    signalsCount: 0,
    voluntaryContextSwitches: 79,
    involuntaryContextSwitches: 1
  }
*/const { resourceUsage } = require('node:process');

console.log(resourceUsage());
/*
  Will output:
  {
    userCPUTime: 82872,
    systemCPUTime: 4143,
    maxRSS: 33164,
    sharedMemorySize: 0,
    unsharedDataSize: 0,
    unsharedStackSize: 0,
    minorPageFault: 2469,
    majorPageFault: 0,
    swappedOut: 0,
    fsRead: 0,
    fsWrite: 8,
    ipcSent: 0,
    ipcReceived: 0,
    signalsCount: 0,
    voluntaryContextSwitches: 79,
    involuntaryContextSwitches: 1
  }
*/

process.send(message[, sendHandle[, options]][, callback])#

  • message <Object>
  • sendHandle <net.Server> | <net.Socket>
  • options <Object> 用於引數化傳送特定型別的控制代碼。options 支援以下屬性:
    • keepOpen <boolean> 一個可以在傳遞 net.Socket 例項時使用的值。當為 true 時,套接字在傳送程序中保持開啟狀態。預設值: false
  • callback <Function>
  • 返回:<boolean>

如果 Node.js 是透過 IPC 通道生成的,可以使用 process.send() 方法向父程序傳送訊息。訊息將在父程序的 ChildProcess 物件上作為 'message' 事件接收。

如果 Node.js 不是透過 IPC 通道生成的,process.send 將為 undefined

訊息會經過序列化和解析。最終收到的訊息可能與最初發送的訊息不同。

process.setegid(id)#

process.setegid() 方法設定程序的有效組標識。(參見 setegid(2)。) id 可以作為數字 ID 或組名字串傳遞。如果指定了組名,此方法將在解析關聯的數字 ID 時阻塞。

import process from 'node:process';

if (process.getegid && process.setegid) {
  console.log(`Current gid: ${process.getegid()}`);
  try {
    process.setegid(501);
    console.log(`New gid: ${process.getegid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}const process = require('node:process');

if (process.getegid && process.setegid) {
  console.log(`Current gid: ${process.getegid()}`);
  try {
    process.setegid(501);
    console.log(`New gid: ${process.getegid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}

此函式僅在 POSIX 平臺(即非 Windows 或 Android)上可用。此功能在 Worker 執行緒中不可用。

process.seteuid(id)#

process.seteuid() 方法設定程序的有效使用者標識。(參見 seteuid(2)。) id 可以作為數字 ID 或使用者名稱字串傳遞。如果指定了使用者名稱,此方法將在解析關聯的數字 ID 時阻塞。

import process from 'node:process';

if (process.geteuid && process.seteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
  try {
    process.seteuid(501);
    console.log(`New uid: ${process.geteuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}const process = require('node:process');

if (process.geteuid && process.seteuid) {
  console.log(`Current uid: ${process.geteuid()}`);
  try {
    process.seteuid(501);
    console.log(`New uid: ${process.geteuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}

此函式僅在 POSIX 平臺(即非 Windows 或 Android)上可用。此功能在 Worker 執行緒中不可用。

process.setgid(id)#

process.setgid() 方法設定程序的組標識。(參見 setgid(2)。) id 可以作為數字 ID 或組名字串傳遞。如果指定了組名,此方法將在解析關聯的數字 ID 時阻塞。

import process from 'node:process';

if (process.getgid && process.setgid) {
  console.log(`Current gid: ${process.getgid()}`);
  try {
    process.setgid(501);
    console.log(`New gid: ${process.getgid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}const process = require('node:process');

if (process.getgid && process.setgid) {
  console.log(`Current gid: ${process.getgid()}`);
  try {
    process.setgid(501);
    console.log(`New gid: ${process.getgid()}`);
  } catch (err) {
    console.error(`Failed to set gid: ${err}`);
  }
}

此函式僅在 POSIX 平臺(即非 Windows 或 Android)上可用。此功能在 Worker 執行緒中不可用。

process.setgroups(groups)#

process.setgroups() 方法為 Node.js 程序設定補充組 ID。這是一個特權操作,需要 Node.js 程序具有 root 許可權或 CAP_SETGID 能力。

groups 陣列可以包含數字組 ID、組名或兩者兼有。

import process from 'node:process';

if (process.getgroups && process.setgroups) {
  try {
    process.setgroups([501]);
    console.log(process.getgroups()); // new groups
  } catch (err) {
    console.error(`Failed to set groups: ${err}`);
  }
}const process = require('node:process');

if (process.getgroups && process.setgroups) {
  try {
    process.setgroups([501]);
    console.log(process.getgroups()); // new groups
  } catch (err) {
    console.error(`Failed to set groups: ${err}`);
  }
}

此函式僅在 POSIX 平臺(即非 Windows 或 Android)上可用。此功能在 Worker 執行緒中不可用。

process.setuid(id)#

process.setuid(id) 方法設定程序的使用者標識。(參見 setuid(2)。) id 可以作為數字 ID 或使用者名稱字串傳遞。如果指定了使用者名稱,此方法將在解析關聯的數字 ID 時阻塞。

import process from 'node:process';

if (process.getuid && process.setuid) {
  console.log(`Current uid: ${process.getuid()}`);
  try {
    process.setuid(501);
    console.log(`New uid: ${process.getuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}const process = require('node:process');

if (process.getuid && process.setuid) {
  console.log(`Current uid: ${process.getuid()}`);
  try {
    process.setuid(501);
    console.log(`New uid: ${process.getuid()}`);
  } catch (err) {
    console.error(`Failed to set uid: ${err}`);
  }
}

此函式僅在 POSIX 平臺(即非 Windows 或 Android)上可用。此功能在 Worker 執行緒中不可用。

process.setSourceMapsEnabled(val)#

穩定性:1 - 實驗性:請改用 module.setSourceMapsSupport()

此函式啟用或停用堆疊跟蹤的源對映支援。

它提供了與使用命令列選項 --enable-source-maps 啟動 Node.js 程序相同的功能。

只有在啟用源對映後加載的 JavaScript 檔案中的源對映才會被解析和載入。

這等同於使用選項 { nodeModules: true, generatedCode: true } 呼叫 module.setSourceMapsSupport()

process.setUncaughtExceptionCaptureCallback(fn)#

process.setUncaughtExceptionCaptureCallback() 函式設定一個在發生未捕獲異常時呼叫的函式,該函式將接收異常值本身作為其第一個引數。

如果設定了這樣的函式,'uncaughtException' 事件將不會被觸發。如果從命令列傳遞了 --abort-on-uncaught-exception 或透過 v8.setFlagsFromString() 設定了該選項,程序將不會中止。配置在異常時執行的操作(如生成報告)也會受到影響。

要取消設定捕獲函式,可以使用 process.setUncaughtExceptionCaptureCallback(null)。在已設定另一個捕獲函式的情況下,使用非 null 引數呼叫此方法將丟擲錯誤。

使用此函式與使用已棄用的 domain 內建模組是互斥的。

process.sourceMapsEnabled#

穩定性:1 - 實驗性:請改用 module.getSourceMapsSupport()

process.sourceMapsEnabled 屬性返回堆疊跟蹤的源對映支援是否已啟用。

process.stderr#

process.stderr 屬性返回一個連線到 stderr (fd 2) 的流。它是一個 net.Socket(它是一個雙工流),除非 fd 2 指向一個檔案,在這種情況下它是一個可寫流。

process.stderr 在重要方面與其他 Node.js 流不同。有關更多資訊,請參見關於程序 I/O 的說明

process.stderr.fd#

此屬性指的是 process.stderr 底層檔案描述符的值。該值固定為 2。在 Worker 執行緒中,此欄位不存在。

process.stdin#

process.stdin 屬性返回一個連線到 stdin (fd 0) 的流。它是一個 net.Socket(它是一個雙工流),除非 fd 0 指向一個檔案,在這種情況下它是一個可讀流。

有關如何從 stdin 讀取的詳細資訊,請參見 readable.read()

作為一個雙工流,process.stdin 也可以在“舊”模式下使用,該模式與為 v0.10 之前的 Node.js 編寫的指令碼相容。有關更多資訊,請參見流相容性

在“舊”流模式下,stdin 流預設是暫停的,因此必須呼叫 process.stdin.resume() 才能從中讀取。另請注意,呼叫 process.stdin.resume() 本身會將流切換到“舊”模式。

process.stdin.fd#

此屬性指的是 process.stdin 底層檔案描述符的值。該值固定為 0。在 Worker 執行緒中,此欄位不存在。

process.stdout#

process.stdout 屬性返回一個連線到 stdout (fd 1) 的流。它是一個 net.Socket(它是一個雙工流),除非 fd 1 指向一個檔案,在這種情況下它是一個可寫流。

例如,要將 process.stdin 複製到 process.stdout

import { stdin, stdout } from 'node:process';

stdin.pipe(stdout);const { stdin, stdout } = require('node:process');

stdin.pipe(stdout);

process.stdout 在重要方面與其他 Node.js 流不同。有關更多資訊,請參見關於程序 I/O 的說明

process.stdout.fd#

此屬性指的是 process.stdout 底層檔案描述符的值。該值固定為 1。在 Worker 執行緒中,此欄位不存在。

關於程序 I/O 的說明#

process.stdoutprocess.stderr 在重要方面與其他 Node.js 流不同:

  1. 它們分別被 console.log()console.error() 內部使用。
  2. 寫入可能是同步的,這取決於流連線到什麼以及系統是 Windows 還是 POSIX:
    • 檔案:在 Windows 和 POSIX 上是同步的
    • TTY(終端):在 Windows 上是非同步的,在 POSIX 上是同步的
    • 管道(和套接字):在 Windows 上是同步的,在 POSIX 上是非同步的

這些行為部分是由於歷史原因,因為更改它們會造成向後不相容,但一些使用者也期望如此。

同步寫入避免了諸如使用 console.log()console.error() 寫入的輸出意外交錯,或者如果在非同步寫入完成前呼叫 process.exit() 則根本不寫入的問題。有關更多資訊,請參見 process.exit()

警告:同步寫入會阻塞事件迴圈,直到寫入完成。在向檔案輸出的情況下,這可能幾乎是瞬時的,但在高系統負載下,接收端未讀取的管道,或者慢速終端或檔案系統的情況下,事件迴圈可能被頻繁且長時間地阻塞,從而產生嚴重的負面性能影響。當寫入到互動式終端會話時,這可能不是問題,但在生產環境中將日誌記錄到程序輸出流時,請特別小心考慮這一點。

要檢查流是否連線到 TTY 上下文,請檢查 isTTY 屬性。

例如:

$ node -p "Boolean(process.stdin.isTTY)"
true
$ echo "foo" | node -p "Boolean(process.stdin.isTTY)"
false
$ node -p "Boolean(process.stdout.isTTY)"
true
$ node -p "Boolean(process.stdout.isTTY)" | cat
false 

有關更多資訊,請參見 TTY 文件。

process.throwDeprecation#

process.throwDeprecation 的初始值表示當前 Node.js 程序是否設定了 --throw-deprecation 標誌。process.throwDeprecation 是可變的,因此是否棄用警告會導致錯誤可以在執行時更改。有關更多資訊,請參閱 'warning' 事件emitWarning() 方法的文件。

$ node --throw-deprecation -p "process.throwDeprecation"
true
$ node -p "process.throwDeprecation"
undefined
$ node
> process.emitWarning('test', 'DeprecationWarning');
undefined
> (node:26598) DeprecationWarning: test
> process.throwDeprecation = true;
true
> process.emitWarning('test', 'DeprecationWarning');
Thrown:
[DeprecationWarning: test] { name: 'DeprecationWarning' } 

process.threadCpuUsage([previousValue])#

process.threadCpuUsage() 方法返回當前工作執行緒的使用者和系統 CPU 時間使用情況,以一個包含 usersystem 屬性的物件形式返回,其值為微秒值(百萬分之一秒)。

可以將上一次呼叫 process.threadCpuUsage() 的結果作為引數傳遞給該函式,以獲得差異讀數。

process.title#

process.title 屬性返回當前程序的標題(即返回 ps 的當前值)。為 process.title 賦一個新值會修改 ps 的當前值。

當分配新值時,不同平臺會對標題施加不同的最大長度限制。通常這些限制相當有限。例如,在 Linux 和 macOS 上,process.title 受限於二進位制檔名加上命令列引數的長度,因為設定 process.title 會覆蓋程序的 argv 記憶體。Node.js v0.8 允許更長的程序標題字串,因為它也覆蓋了 environ 記憶體,但這在某些(相當晦澀的)情況下可能不安全且令人困惑。

process.title 賦值可能不會在程序管理器應用程式(如 macOS 的活動監視器或 Windows 的服務管理器)中產生準確的標籤。

process.traceDeprecation#

process.traceDeprecation 屬性指示當前 Node.js 程序是否設定了 --trace-deprecation 標誌。有關此標誌行為的更多資訊,請參閱 'warning' 事件emitWarning() 方法的文件。

process.umask()#

穩定性:0 - 已棄用。不帶引數呼叫 process.umask() 會導致程序範圍的 umask 被寫入兩次。這會線上程之間引入競爭條件,並且是一個潛在的安全漏洞。沒有安全的、跨平臺的替代 API。

process.umask() 返回 Node.js 程序的檔案模式建立掩碼。子程序從父程序繼承掩碼。

process.umask(mask)#

process.umask(mask) 設定 Node.js 程序的檔案模式建立掩碼。子程序從父程序繼承掩碼。返回先前的掩碼。

import { umask } from 'node:process';

const newmask = 0o022;
const oldmask = umask(newmask);
console.log(
  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`,
);const { umask } = require('node:process');

const newmask = 0o022;
const oldmask = umask(newmask);
console.log(
  `Changed umask from ${oldmask.toString(8)} to ${newmask.toString(8)}`,
);

Worker 執行緒中,process.umask(mask) 將會丟擲異常。

process.unref(maybeRefable)#

穩定性:1 - 實驗性

  • maybeUnfefable <any> 一個可能是“可取消引用”的物件。

一個物件是“可取消引用的”,如果它實現了 Node.js 的“Refable 協議”。具體來說,這意味著該物件實現了 Symbol.for('nodejs.ref')Symbol.for('nodejs.unref') 方法。被“引用”(Ref'd)的物件將使 Node.js 事件迴圈保持活動狀態,而被“取消引用”(unref'd)的物件則不會。歷史上,這是透過直接在物件上使用 ref()unref() 方法來實現的。然而,這種模式正在被棄用,以支援“Refable 協議”,以便更好地支援 Web 平臺 API 型別,這些型別的 API 無法修改以新增 ref()unref() 方法,但仍需支援該行為。

process.uptime()#

process.uptime() 方法返回當前 Node.js 程序已執行的秒數。

返回值包括秒的小數部分。使用 Math.floor() 來獲取整數秒。

process.version#

process.version 屬性包含 Node.js 版本字串。

import { version } from 'node:process';

console.log(`Version: ${version}`);
// Version: v14.8.0const { version } = require('node:process');

console.log(`Version: ${version}`);
// Version: v14.8.0

要獲取不帶字首 v 的版本字串,請使用 process.versions.node

process.versions#

process.versions 屬性返回一個列出 Node.js 及其依賴項版本字串的物件。process.versions.modules 表示當前的 ABI 版本,每當 C++ API 發生變化時,該版本就會增加。Node.js 將拒絕載入針對不同模組 ABI 版本編譯的模組。

import { versions } from 'node:process';

console.log(versions);const { versions } = require('node:process');

console.log(versions);

將生成一個類似於以下內容的物件:

{ node: '23.0.0',
  acorn: '8.11.3',
  ada: '2.7.8',
  ares: '1.28.1',
  base64: '0.5.2',
  brotli: '1.1.0',
  cjs_module_lexer: '1.2.2',
  cldr: '45.0',
  icu: '75.1',
  llhttp: '9.2.1',
  modules: '127',
  napi: '9',
  nghttp2: '1.61.0',
  nghttp3: '0.7.0',
  ngtcp2: '1.3.0',
  openssl: '3.0.13+quic',
  simdjson: '3.8.0',
  simdutf: '5.2.4',
  sqlite: '3.46.0',
  tz: '2024a',
  undici: '6.13.0',
  unicode: '15.1',
  uv: '1.48.0',
  uvwasi: '0.0.20',
  v8: '12.4.254.14-node.11',
  zlib: '1.3.0.1-motley-7d77fb7' } 

退出碼#

當沒有更多非同步操作待處理時,Node.js 通常會以狀態碼 0 退出。在其他情況下使用以下狀態碼:

  • 1 未捕獲的致命異常:存在一個未捕獲的異常,並且它沒有被域(domain)或 'uncaughtException' 事件處理程式處理。
  • 2: 未使用(由 Bash 為內建命令誤用保留)
  • 3 內部 JavaScript 解析錯誤:Node.js 引導過程中的內部 JavaScript 原始碼導致瞭解析錯誤。這種情況極為罕見,通常只可能在 Node.js 本身的開發過程中發生。
  • 4 內部 JavaScript 評估失敗:Node.js 引導過程中的內部 JavaScript 原始碼在評估時未能返回一個函式值。這種情況極為罕見,通常只可能在 Node.js 本身的開發過程中發生。
  • 5 致命錯誤:V8 中存在一個致命的不可恢復錯誤。通常會向 stderr 列印一條帶有字首 FATAL ERROR 的訊息。
  • 6 非函式的內部異常處理程式:存在一個未捕獲的異常,但內部致命異常處理函式由於某種原因被設定為非函式,無法被呼叫。
  • 7 內部異常處理程式執行時失敗:存在一個未捕獲的異常,並且內部致命異常處理函式本身在嘗試處理它時丟擲了一個錯誤。例如,當一個 'uncaughtException'domain.on('error') 處理程式丟擲錯誤時,可能會發生這種情況。
  • 8: 未使用。在 Node.js 的早期版本中,退出碼 8 有時表示未捕獲的異常。
  • 9 無效引數:指定了一個未知的選項,或者一個需要值的選項沒有提供值。
  • 10 內部 JavaScript 執行時失敗:Node.js 引導過程中的內部 JavaScript 原始碼在呼叫引導函式時丟擲了一個錯誤。這種情況極為罕見,通常只可能在 Node.js 本身的開發過程中發生。
  • 12 無效的除錯引數:設定了 --inspect 和/或 --inspect-brk 選項,但選擇的埠號無效或不可用。
  • 13 未解決的頂層 Await:在頂層程式碼中函式之外使用了 await,但傳遞的 Promise 從未解決。
  • 14 快照失敗:Node.js 啟動以構建 V8 啟動快照,但由於應用程式狀態的某些要求未得到滿足而失敗。
  • >128 訊號退出:如果 Node.js 收到一個致命訊號,如 SIGKILLSIGHUP,那麼它的退出碼將是 128 加上訊號碼的值。這是一種標準的 POSIX 實踐,因為退出碼被定義為 7 位整數,而訊號退出會設定高位,然後包含訊號碼的值。例如,訊號 SIGABRT 的值為 6,因此預期的退出碼將是 128 + 6,即 134