2013-04-23 54 views
0

我有以下代碼的NodeJS:沒有的NodeJS產卵子進程除了在測試

var spawn = require('child_process').spawn; 

var Unzipper = { 
    unzip: function(src, dest, callback) { 
    var self = this; 

    if (!fs.existsSync(dest)) { 
     fs.mkdir(dest); 
    } 

    var unzip = spawn('unzip', [ src, '-d', dest ]); 

    unzip.stdout.on('data', function (data) { 
     self.stdout(data); 
    }); 

    unzip.stderr.on('data', function (data) { 
     self.stderr(data); 

     callback({message: "There was an error executing an unzip process"}); 
    }); 

    unzip.on('close', function() { 
     callback(); 
    }); 
    } 
}; 

我有一個NodeUnit測試成功執行。使用phpStorm調試,如果我運行相同的代碼作爲Web服務的一部分,VAR 解壓正確分配

phpStorm debug screenshot of test

但是試驗中,產卵調用不正確返回和服務器在嘗試將上的處理程序附加到不存在的標準輸出上時崩潰解壓的屬性 var。

enter image description here

我試着運行程序phpStorm之外,但它崩潰的命令行以及出於同樣的原因。我懷疑這是測試不必處理的權限問題。 Web服務器產生進程可能會導致生產環境出現混亂,因此可能需要一些額外的權限,但是我一直無法找到(或者我錯過了)文檔來支持我的假設。

我在OSX Snow Leopard上運行v0.10.3(通過MacPorts)。

爲什麼我無法正確產生子進程?

最新通報

對於@喬納森 - wiepert

我使用Prototypical inheritance所以當我創建一個Unzipper的 「實例」 我設置輸出和錯誤,即:

var unzipper = Unzipper.spawn({ 
    stdout: function(data) { util.puts(data); }, 
    stderr: function(data) { util.puts(data); } 
}); 

這類似於「構造函數注入」的概念。至於你的其他觀點,謝謝你的提示。

我得到的錯誤是:

project/src/Unzipper.js:15 
    unzip.stdout.on('data', function (data) { 
       ^
TypeError: Cannot call method 'on' of undefined 

按我的調試截圖,即從產卵調用返回的對象是不同情況下的不同。我的測試通過了(它檢查ZIP是否可以正確解壓縮),因此在將此代碼作爲Web服務運行時出現問題。

+0

應該是一個評論:移動它在這裏: unzip(函數)沒有stdout或stderr,所以 self.stdout(data); 和 self.stderr(data); 都會失敗,並顯示如下錯誤: self。標準錯誤(數據); ^ TypeError:對象#沒有方法'stderr' 您應該將這些更改爲console.log/error或其他行。此外,即使有數據發送到unzip.stderr,unzip.on('close'...處理程序也會被調用,所以不需要從stderr處理程序中調用回調。 如果這不是問題, – 2013-04-24 00:57:14

+0

您是否使用某個框架將其作爲Web服務啓動? – 2013-04-24 00:58:31

+0

不,只需使用http.createServer(),傳遞的處理程序將調用解壓縮的「方法」 。我的API非常簡單,只需使用我自己的函數來處理HTTP請求。 – kierans 2013-04-24 01:17:50

回答

1

問題是在對象原型上創建的spawn方法(請參閱this article on Protypical inheritance)導致child_process.spawn函數被替換,因此調用了錯誤的函數。

我將child_process.spawn保存到Unzipper「class」的屬性中,然後它被破壞並使用該屬性。