Bluebird で Node の child_process.exec および child_process.execFile 関数を Promisify するにはどうすればよいでしょうか? 質問する

Bluebird で Node の child_process.exec および child_process.execFile 関数を Promisify するにはどうすればよいでしょうか? 質問する

私は Node.js で Bluebird promise ライブラリを使用していますが、とても便利です。しかし、質問があります。

Nodeのドキュメントを見てみると子プロセス.execそしてchild_process.execファイルこれらの関数は両方とも ChildProcess オブジェクトを返していることがわかります。

では、このような関数を Promise 化するための推奨される方法は何でしょうか?

以下が機能することに注意してください (Promise オブジェクトを取得します)。

var Promise = require('bluebird');
var execAsync = Promise.promisify(require('child_process').exec);
var execFileAsync = Promise.promisify(require('child_process').execFile);

しかし、元の Node.js 関数の元の戻り値にアクセスするにはどうすればよいでしょうか? (このような場合、最初に返された ChildProcess オブジェクトにアクセスできる必要があります。)

ご提案があればぜひお願いします!

編集:

以下は、child_process.exec 関数の戻り値を使用するコード例です。

var exec = require('child_process').exec;
var child = exec('node ./commands/server.js');
child.stdout.on('data', function(data) {
    console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
    console.log('stderr: ' + data);
});
child.on('close', function(code) {
    console.log('closing code: ' + code);
});

しかし、exec 関数の Promisified バージョン (上記の execAsync) を使用すると、戻り値は ChildProcess オブジェクトではなく、Promise になります。これが私が話している本当の問題です。

ベストアンサー1

Bluebird のような追加のライブラリ依存関係よりも、言語に組み込まれた標準の JS Promise を使用することをお勧めします。

Node 10以降を使用している場合は、Node.js ドキュメントutil.promisifyオブジェクトを返す を使用することをお勧めしますPromise<{ stdout, stderr }>。以下の例を参照してください。

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function lsExample() {
  try {
    const { stdout, stderr } = await exec('ls');
    console.log('stdout:', stdout);
    console.log('stderr:', stderr);
  } catch (e) {
    console.error(e); // should contain code (exit code) and signal (that caused the termination).
  }
}
lsExample()

まず からエラーを処理しますstderr

おすすめ記事