> node -e "util.promisify(child_process.exec)(`node -e 'console.log(1);console.error(2)'`).then((...x) => console.log('T', x), (...x) => console.log('F', x))"
T [ { stdout: '1\n', stderr: '2\n' } ]

正常終了 exitcode が 0 のときは stdout, stderr がプロパティのオブジェクトを then の引数で受け取れる
それぞれに出力が入ってる
基本行末に改行があるので === するときは trim 必要なのに注意

> node -e "util.promisify(child_process.exec)(`node -e 'console.log(1);console.error(2);process.exit(1)'`).then((...x) => console.log('T', x), (...x) => console.log('F', x))"
F [ { Error: Command failed: node -e 'console.log(1);console.error(2);process.exit(1)'
2


at ChildProcess.exithandler (child_process.js:294:12)
at ChildProcess.emit (events.js:189:13)
at maybeClose (internal/child_process.js:970:16)
at Process.ChildProcess._handle.onexit (internal/child_process.js:259:5)
killed: false,
code: 1,
signal: null,
cmd:
'node -e \'console.log(1);console.error(2);process.exit(1)\'',
stdout: '1\n',
stderr: '2\n' } ]

エラー終了 exitcode が 0 でないときは エラーオブジェクトを catch の引数で受け取れる
code プロパティに exitcode
stdout/stderr に各出力が入ってる
エラーのメッセージは stderr が使われる