1

次のコードで子プロセスを実行しようとしています:

run = function (cmd, callback) {
    var spawn = require('child_process').spawn;
    var command = spawn(cmd);

    var result = '';

    command.stdout.on('data', function (data) {
        result += data.toString();
    });

    command.on('exit', function () {
        callback(result);
    });
}

execQuery = function (cmd) {
    var result = {
        errnum: 0,
        error: 'No errors.',
        body: ''
    };

    run(cmd, function (message) {
        result.body = message;

        console.log(message);
    });

    return result;
}

execQuery('ls') の実行後、 result.bodyは常に空ですが、console.logには値が含まれています。

4

1 に答える 1

1

簡単なテストを実行したところ、すべてのデータが排出さexitれる前にコマンドのイベントが発生しました。のイベントを探すようにハンドラーをstdout変更した場合、少なくとも出力をキャプチャして印刷しました。exitcommand.stdoutend

command.stdout.on('end', function () {
    callback(result);
});

それは少し役立つはずです。これに使用したい既存のライブラリがあり、本当に正しい実装はあなたが持っているものよりもはるかに複雑になることに注意してください.しかし、私の変更はあなたの現在の障害問題に対処するはずです.

ランダムなヒント: エラーのためにコールバック関数の最初の引数を常に予約するのはノードの規則であり、スニペットはその規則と矛盾しています。おそらく、規則に合わせて調整する必要があります。

申し訳ありませんが、 についての質問に答えさせてくださいresult.bodyrun関数は非同期です! つまり、コールバック本体return result;の前にコード行が実行されることを意味します。I/O が関係している場合、ノードのどこでもそのような戻り値を使用することはできません。コールバックを使用する必要があります。runresult.body = message;

于 2013-05-29T04:45:23.993 に答える