我有以下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 解压缩
但是,如果我将相同的代码作为Web服务的一部分运行,那么 spawn 调用将无法正常返回,并且服务器在尝试附加 on 处理程序时崩溃 unzip var
的 stdout 属性
我已经尝试在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服务运行时会出现问题。
答案 0 :(得分:1)
问题是在Object原型上创建的spawn方法(参见this article on Protypical inheritance)导致child_process.spawn函数被替换,因此调用了错误的函数。
我将child_process.spawn保存到Unzipper“class”的属性中,然后才被破坏并改为使用该属性。