0

我有以下 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 unzip被正确分配

phpStorm调试测试截图

但是,如果我将相同的代码作为 Web 服务的一部分运行,则spawn调用不会正确返回,并且服务器会在尝试将on处理程序附加到unzip var的不存在的stdout属性时崩溃。

在此处输入图像描述

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

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

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

更新

对于@jonathan-wiepert

我正在使用原型继承,所以当我创建 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

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

4

1 回答 1

1

问题是在 Object 原型上创建的 spawn 方法(请参阅有关 Protypical 继承的这篇文章)导致 child_process.spawn 函数被替换,因此调用了错误的函数。

在它被破坏之前,我将 child_process.spawn 保存到 Unzipper“类”的一个属性中,并改用该属性。

于 2013-04-24T01:58:57.727 回答