我有以下 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被正确分配
但是,如果我将相同的代码作为 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 服务运行时会出现问题。