2013-04-23 55 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”的属性中,然后它被破坏并使用该属性。