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也遵循這個規範。