0

次の 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が正しく割り当てられます

テストのphpStormデバッグスクリーンショット

ただし、同じコードを 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 サービスとして実行すると問題が発生します。

4

1 に答える 1

1

問題は、オブジェクト プロトタイプで作成された spawn メソッド (プロトタイプの継承に関するこの記事を参照) によって child_process.spawn 関数が置き換えられたため、間違った関数が呼び出されていたことです。

child_process.spawn を Unzipper の「クラス」のプロパティに保存してから、上書きして代わりにそのプロパティを使用しました。

于 2013-04-24T01:58:57.727 に答える