除了在测试中,NodeJS不会生成子进程

时间:2013-04-23 13:16:41

标签: node.js spawn nodeunit

我有以下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调试测试正确分配var 解压缩

phpStorm debug screenshot of test

但是,如果我将相同的代码作为Web服务的一部分运行,那么 spawn 调用将无法正常返回,并且服务器在尝试附加 on 处理程序时崩溃 unzip var

stdout 属性

enter image description here

我已经尝试在phpStorm之外运行该程序,但是出于同样的原因它也在命令行崩溃了。我怀疑它是一个权限问题,测试不必处理。 Web服务器生成进程可能会导致生产环境中出现混乱,因此可能需要一些额外的权限,但我无法找到(或者我已经错过)文档来支持我的假设。

我在OSX Snow Leopard上运行v0.10.3(通过MacPorts)。

为什么我不能正确生成子进程?

更新

@ jonathan-wiepert

我正在使用Prototypical inheritance所以当我创建一个Unzipper的“实例”时,我设置stdout和stderr即:

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

根据我的调试屏幕截图, spawn 调用返回的对象在不同情况下是不同的。我的测试通过(它检查ZIP是否可以正确解压缩),因此将此代码作为Web服务运行时会出现问题。

1 个答案:

答案 0 :(得分:1)

问题是在Object原型上创建的spawn方法(参见this article on Protypical inheritance)导致child_process.spawn函数被替换,因此调用了错误的函数。

我将child_process.spawn保存到Unzipper“class”的属性中,然后才被破坏并改为使用该属性。