node.js 標準/錯誤輸出 和 process.exit

node.js中,各類模塊有一種標準的寫法:node

this._process.exec(command, options, function (err, stdout, stderr) {
            callback(err, stdout, stderr);
        })

這裏說的標準,是指回調函數,通常有err做爲第一個參數,而後是具體的數據。linux

 

寫服務器程序的時候,或多或少會用到child_process這個模塊,而這個模塊的用法正如上邊代碼所示。web

例如調用一個shell命令刪除文件,能夠這樣:shell

    child_process.exec('rm -rf xxxx', function (err, stdout, stderr) {
            callback(err, stdout, stderr);
        })

返回的參數,其實err是一個對象,而stdout和stderr是字符串,stdout就是執行的子進程中使用標準輸出的信息,而stderr就是子進程中錯誤輸出流的內容。服務器

 

那麼問題來了,若是咱們本身用node.js寫一個簡單腳本,讓其餘node程序去調用,怎麼模仿實現同樣的返回狀況呢?函數

其餘程序調用的時候,多是這樣:this

child_process.exec('node doSomething.js', function (err, stdout, stderr) {
            callback(err, stdout, stderr);
        })

若是咱們在子進程中,使用console.log/error打印信息,結果,會發現,在父進程的回調函數中將什麼都得不到。spa

奇了怪了,console.error不就是錯誤輸出嗎?好吧,這隻能怪本身寫web寫多了,而後node.js並非這樣的。prototype

 

接下來就要介紹三個玩意,分別對應stdout、stderr和err。code

process.stdout.write
process.stderr.write
process.exit(非0)

 

write函數接受的是一個字符串,那麼爲了方便使用,咱們能夠封裝一下:

console.error = function () {
    var msg = Array.prototype.join.call(arguments, ', ');
    process.stderr.write(msg);
};

 

最後,若是程序跑出錯,除了在stderr中輸出信息外,咱們還可能須要馬上終止程序。

按照linux的規範,通常成功用0表示,而非0則表示失敗。那麼process.exit也遵循這個規範。

  • process.exit(0)表示成功完成,回調函數中,err將爲null;
  • process.exit(非0)表示執行失敗,回調函數中,err不爲null,err.code就是咱們傳給exit的數字。
相關文章
相關標籤/搜索