У меня есть код следующие NodeJS: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 для отладки теста вар разархивировать назначен правильно
Однако, если я запускаю тот же код, как часть веб-службы, икру вызов не возвращает правильно и сервер сбой при попытке подключить на обработчик несуществующего stdout property of unzip var.
Я попытался запустить программу вне PhpStorm, однако он выходит из строя в командной строке, а по той же причине. Я подозреваю, что это проблема с разрешениями, с которой испытаниям не приходится иметь дело. Процессы нереста веб-сервера могут вызвать хаос в рабочей среде, поэтому могут потребоваться некоторые дополнительные разрешения, но я не смог найти (или пропустил) документацию для поддержки моей гипотезы.
Я бегу v0.10.3 на OSX Snow Leopard (через MacPorts).
Почему я не могу правильно создать дочерний процесс?
ОБНОВЛЕНИЕ
Для @ Джонатан-wiepert
Я использую Prototypical inheritance так, когда я создаю "экземпляр" 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
В соответствии с моими отладкой скриншотов, объект, который возвращается из отродье вызова отличается при различных обстоятельствах. Мой тест проходит (он проверяет, что ZIP можно распаковать правильно), поэтому проблема возникает при запуске этого кода в качестве веб-службы.
Должно быть, комментарий: перемещение его здесь: unzip (функция) не имеет stdout или stderr, поэтому self.stdout (data); и self.stderr (data); оба с ошибкой: self.STDERR (данные); ^ TypeError: Object # не имеет метода 'stderr' Возможно, вы должны изменить их на console.log/error или что-то в этом роде. Кроме того, вызов unzip.on ('close' ... будет вызываться, даже если есть данные, отправленные на unzip.stderr, поэтому не нужно вызывать обратный вызов внутри обработчика stderr. Если это не проблема, пожалуйста, опубликуйте сообщение об ошибке, которое вы получаете из веб-службы. –
Вы используете какую-либо фреймворк, чтобы запустить его как веб-службу? –
Нет, просто используя http.createServer(), обработчик, который получает переданный вызов, распаковывает «метод», Мой API очень прост, поэтому я просто использую свои собственные функции для обработки HTTP-запросов. – kierans