У меня есть следующий код 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 для отладки теста, переменная unzip назначается правильно
Однако, если я запускаю тот же код как часть веб-службы, вызов spawn не возвращается должным образом, и сервер падает при попытке присоединить обработчик on к несуществующему Свойство stdout переменной unzip.
Я пытался запустить программу вне phpStorm, однако по той же причине она вылетает и в командной строке. Я подозреваю, что это проблема с разрешениями, с которой тесты не должны иметь дело. Процессы порождения веб-сервера могут вызвать хаос в производственной среде, поэтому могут потребоваться некоторые дополнительные разрешения, но я не смог найти (или пропустил) документацию, подтверждающую мою гипотезу.
Я использую v0.10.3 на OSX Snow Leopard (через MacPorts).
Почему я не могу правильно создать дочерний процесс?
ОБНОВЛЕНИЯ
Для @jonathan-wiepert
Я использую Прототипное наследование, поэтому, когда я создаю "экземпляр" 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-файл можно правильно разархивировать), поэтому проблема возникает при запуске этого кода в качестве веб-службы.