次の 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呼び出しが正しく返されず、 unzip varの存在しないstdoutプロパティにonハンドラーをアタッチしようとすると、サーバーがクラッシュします。
プログラムをphpStormの外で実行しようとしましたが、同じ理由でコマンドラインでもクラッシュします。テストで対処する必要がないのは、アクセス許可の問題だと思います。Web サーバーの生成プロセスは実稼働環境で混乱を引き起こす可能性があるため、追加のアクセス許可が必要になる可能性がありますが、私の仮説を裏付けるドキュメントを見つけることができませんでした (または見逃してしまいました)。
OSX Snow Leopard (MacPorts 経由) で v0.10.3 を実行しています。
子プロセスを正しく生成できないのはなぜですか?
アップデート
@ジョナサン・ウィーパートのために
私はプロトタイプの継承を使用しているので、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 サービスとして実行すると問題が発生します。