極簡 Node.js 入門 - 2.3 process
極簡 Node.js 入門系列教程://www.yuque.com/sunluyong/node
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 屬性返回一個數組,內容是執行腳本時的參數,但數組前兩個固定
- 執行當前腳本的 Node 二進位文件的絕對路徑
- 當前執行文件絕對路徑
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 添加到下一個時間點的隊列執行

