私は 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
。