- 新時期的Node.js入門
- 李鍇
- 1390字
- 2019-12-12 17:05:45
2.11 Process對象
Process是一個全局對象,無須聲明即可訪問,每個Node進程都有獨立的process對象。該對象中存儲了當前進程的環境變量,也定義了一些事件。下面是一些例子:

2.11.1 環境變量
直接在Node repl環境中執行:

會得到一大串和當前進程相關的環境變量或者全局變量,你可以在其中查看你當前使用的Node版本號等一些信息。
輸出結果:

例如開發者可以在代碼中判斷當前正在運行的Node屬于哪個版本,并根據結果來決定是否運行含有一些最新特性的代碼:

2.11.2 方法和事件
process模塊定義了如下事件。
- Event: 'beforeExit':事件循環里沒有要處理的事件了,退出的預備動作。
- Event: 'disconnect':子進程IPC通道關閉時觸發。
- Event: 'exit':進程退出時觸發。
- Event: 'message':進程間通信中使用。
- Event: 'rejectionHandled':一個Promise轉換為rejected并且被捕獲時觸發。
- Event: 'uncaughtException':未經捕獲的異常,慎用。
- Event: 'unhandledRejection':未經捕獲的rejected。
- Event: 'warning':Node發出警告信息時觸發。
Message、disconnect我們已經介紹過了,unhandledRejection和uncaughtException通常用做錯誤處理的最后一層保險,下面的代碼可以保證進程不會因為出錯而退出:

但不代表開發者可以省略具體錯誤處理的代碼,我們會在第8章中詳細介紹。
beforeExit比較有意思,它僅僅會在進程準備退出時觸發,準備退出是指目前的事件循環沒有要執行的任務了,如果我們手動捕獲這一事件并在回調中增加一些額外動作,進程就不會退出。

而exit事件不同,當進程觸發exit事件后,無論如何都會退出。

2.11.3 一個例子:修改所在的時區
這個需求可能并不常見,但在某些情況下可能十分有用。
假設開發者要向某臺服務器提交數據,但沒有和該服務器處在同一個時區內(在國內通常采用標準北京時間,所以不是很常見),這就導致開發者的時間和服務器的時間可能會相差幾個小時,有的服務器會拒絕這樣的請求。JavaScript獲得當前的時間通常使用Date對象來實現,在stackoverflow上搜索相關的問題可以找到類似如下的代碼。
代碼2.37 舊版本Node中設置時區的方法

上面的一段代碼將當前的時區置于零時區,試著在本地運行,輸出的結果為:

上面的這段代碼已經有些年頭了,在早期版本的Node中這樣的設置確實有效,筆者初次看到這段代碼時還在使用V0.12版本。經過測試,上面的代碼在v5.3.0中還可以正常發揮作用,但在比較新的版本,例如6.9.4及以上的版本中,即使TZ設置成Asia/Shanghai,返回的也始終是倫敦時間。
在舊的版本中,打印一個date對象返回的是當前時區的時間,但在新版本中直接返回的就是世界時,即greenwich時間,相比東八區要早8個小時,格式也不再是GMT格式,這代表就算要獲取當前時間都要做一下額外轉換。
通??梢允褂肈ate對象提供的全局方法來進行轉換。

此外date對象還有一個名為getTimezoneOffset的方法可用,用這個方法可以得到當前的時區。

在上面的代碼中,雖然直接打印date對象顯示的是greenwich時間,但執行getTimezoneOffset()方法返回的卻是-480,表示偏移的分鐘數。這代表Node其實知道我們位于哪個時區,但返回的都是Greenwich時間。
對于修改時區的問題,我們可以使用Date提供的API來進行修改,但如果不想修改之前使用TZ這一環境變量留下的代碼,完全可以自己實現相關的配置。
實現timezone的修改
經過試驗,雖然設置process.env.TZ的方法不能用了,但我們完全可以自己實現一套可用代碼出來。
為此,我們首先在Date對象的prototype上聲明一個map結構作為屬性,用于存儲時區名稱和偏移量的關系,然后對Date類的Date方法進行修改,如果沒有聲明process.env.TZ變量,就默認返回原來的date對象;如果聲明了該屬性,就先到對應的數組中進行搜索,然后返回修改后的date對象。
代碼2.38 自己實現的修改時區的方法

開發者可能會擔心d.getHours()+item[1]這句代碼會出現大于24的情況,所幸setHours方法已經內置了對這種情況的處理,如果小時的范圍小于0或者大于24,會對日期進行相應的加減。
- DB2 V9權威指南
- TypeScript Essentials
- Java多線程編程實戰指南:設計模式篇(第2版)
- MongoDB for Java Developers
- 機械工程師Python編程:入門、實戰與進階
- Learning Apache Kafka(Second Edition)
- 微信小程序全棧開發技術與實戰(微課版)
- Python機器學習之金融風險管理
- Scratch從入門到精通
- UX Design for Mobile
- JavaScript悟道
- Learning Grunt
- ABAQUS6.14中文版有限元分析與實例詳解
- Microsoft Exchange Server 2016 PowerShell Cookbook(Fourth Edition)
- Java程序設計實用教程(第2版)