1. 程式人生 > 實用技巧 >極簡 Node.js 入門 - 2.3 process

極簡 Node.js 入門 - 2.3 process

極簡 Node.js 入門系列教程:https://www.yuque.com/sunluyong/node

本文更佳閱讀體驗:https://www.yuque.com/sunluyong/node/process

process 物件是一個全域性變數,是一個 EventEmitter 例項,提供了當前 Node.js 程序的資訊和操作方法

系統資訊

process 物件提供了屬性用於返回關鍵系統資訊,常用的有

  • title:程序名稱,預設值 node,程式可以修改,可以讓錯誤日誌更清晰
  • pid:當前程序 pid
  • ppid:當前程序的父程序 pid
  • platform:執行程序的作業系統(aix、drawin、freebsd、linux、openbsd、sunos、win32)
  • version:Node.js 版本
  • env:當前Shell的所有環境變數

stdin & stdout

Node.js 和標準輸入、輸出裝置互動物件也通過 process 物件提供

process.stdin.pipe(process.stdout)


簡單一行程式碼可以實現把控制檯輸入內容在控制檯原樣打印出來

執行資訊

process.execPath

process.execPath 屬性返回執行當前指令碼的 Node 二進位制檔案的絕對路徑

process.argv

process.argv 屬性返回一個數組,內容是執行指令碼時的引數,但陣列前兩個固定

  1. 執行當前指令碼的 Node 二進位制檔案的絕對路徑
  2. 當前執行檔案絕對路徑


process.js

console.log(process.argv);
node process.js a --b=2

[
  '/usr/local/bin/node',
  '/Users/undefined/node-demo/process.js',
  'a',
  '--b=2'
]

process.execArgv

process.execArgv 屬性返回一個數組,成員是命令列下執行指令碼時,在 Node 可執行檔案與指令碼檔案之間的命令列引數


process.js

console.log(process.execArgv);
node --inspect process.js

[ '--inspect' ]

常用操作方法

  • process.chdir():切換工作目錄到指定目錄
  • process.cwd():返回運行當前指令碼的工作目錄的路徑,也就是執行 node 命令時候的目錄
  • process.exit():退出當前程序
  • process.memoryUsage():返回 Node.js 程序的記憶體使用情況

程序事件

process 物件是 EventEmitter 物件例項,可以監聽一些系統核心事件, 常使用的有

exit

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

  • 顯式呼叫 process.exit() 方法
  • Node.js 事件迴圈不再需要執行任何其他工作

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

process.on('exit', (code) => {
  console.log(`退出碼: ${code}`);
});

uncaughtException

當前程序丟擲一個沒有被捕捉的錯誤時,會觸發uncaughtException事件

process.on('uncaughtException', function (err) {
  console.error(err.stack);
});

beforeExit

當 Node.js 清空其事件迴圈並且沒有其他工作要安排時,會觸發 beforeExit 事件。 通常 Node.js 程序將在沒有排程工作時退出,但是在 beforeExit 事件上註冊的監聽器可以進行非同步呼叫使 Node.js 程序繼續

process.on('beforeExit', (code) => {
  console.log('程序 beforeExit 事件的程式碼: ', code);
});

process.on('exit', (code) => {
  console.log('程序 exit 事件的程式碼: ', code);
});

console.log('此訊息最新顯示');

// 列印:
// 此訊息最新顯示
// 程序 beforeExit 事件的程式碼: 0
// 程序 exit 事件的程式碼: 0

message

如果使用 IPC 通道 fork Node.js 程序,子程序收到父程序使用 childprocess.send() 傳送的訊息,就會觸發 message 事件

process.on('message', (m) => {
  console.log('子程序收到訊息', m);
});

process.nextTick(callback)

process.nextTick() 方法將 callback 新增到下一個時間點的佇列執行