雖然node對操作系統做了很多抽象的工作,但是你還是可以直接和他交互,比如和系統中已經存在的進程進行交互,創建工作子進程。node是一個用于事件循環的線程,但是你可以在這個事件循環之外創建其他的進程(線程)參與工作。
進程模塊
process模塊允許你獲得或者修改當前node進程的設置,不想其他的模塊,process是一個全局進程(node主進程),你可以直接通過process變量直接訪問它。
process實現了EventEmitter接口,exit方法會在當進程退出的時候執行。因為進程退出之后將不再執行事件循環,所有只有那些沒有回調函數的代碼才會被執行。在下面例子中,setTimeout里面的語句是沒有辦法執行到的。
process.on('exit', function () { setTimeout(function () { console.log('This will not run'); }, 100); console.log('Bye.');});在你接觸node之后,你就會發現那些影響了主事件循環的異常會把整個node進程宕掉的。這會是相當嚴重的問題,所以process提供了另外一個有用的事件uncaughtException來解決這個問題,他會把異常抓取出來供你處理。
process.on('uncaughtException', function (err) { console.log('Caught exception: ' + err);});setTimeout(function () { console.log('This will still run.');}, 500);// Intentionally cause an exception, but don't catch it.nonexistentFunc();console.log('This will not run.');我們來看上面的例子,我們注冊了uncaughtException事件來捕捉系統異常。執行到nonexistentFunc()時,因為該函數沒有定義所以會拋出異常。因為javascript是解釋性的語言,nonexistentFunc()方法上面的語句不會被影響到,他下面的語句不會被執行。所以他的執行結果如下:
Caught exception: ReferenceError: nonexistentFunc is not defined
This will still run.
我們再看一個例子。
var http = require('http');var server = http.createServer(function(req,res) { res.writeHead(200, {}); res.end('response'); badLoggingCall('sent response'); console.log('sent response');});process.on('uncaughtException', function(e) { console.log(e);});server.listen(8080);在這里例子中我們創建了一個web服務器,當處理完請求之后,我們會執行badLoggingCall()方法。因為這個方法不存在,所以會有異常拋出。但是我們注冊的uncaughtException事件會對異常做出處理,這樣服務器不會受到影響得以繼續運行。我們會在服務器端記錄錯誤日志。
[ReferenceError: badLoggingCall is not defined]
與當前進程交互
node提供了一些process的屬性,如下:
process.version:包含當前node實例的版本號;
新聞熱點
疑難解答
圖片精選