即使抛出错误,异步函数也会以代码 0 退出

Async function does exit with code 0 even if error was thrown

有谁知道在抛出错误时如何使异步函数以非零退出代码退出?

如果同步函数抛出错误,NodeJS 脚本将退出并显示错误代码:

sync.js:

'use strict'

const main = function () {
    throw Error('Something failed hard')
}

main()
$ node sync.js
> ... Error: Something failed hard ...

$ echo $?
> 130

但是如果我对异步函数做同样的事情,错误代码总是0:

async.js:

'use strict'

const main = async function () {
    throw Error('Something failed hard')
}

main()
$ node async.js
> ... UnhandledPromiseRejectionWarning: Error: Something failed hard ...

$ echo $?
> 0

我能做的最接近的事情是:

async2.js:

'use strict'

const main = async function () {
    process.exit(1)
    throw Error('Something failed hard')
}

main()
$ node async2.js

$ echo $?
> 1

但是由于脚本已经退出,因此不会抛出错误:-P

我正在使用节点 12.8.3。

我猜脚本不会等到 promise 被拒绝后才退出。但是我不知道如何让异步函数等待,因为我不能在函数之外使用 await :-P

我发现您不需要使用 process.exit(<code>) 但您可以使用 process.exitCode = <code>.

设置脚本退出时将使用的退出代码

所以这有效:

async3.js:

'use strict'

const main = async function () {
    process.exitCode = 1
    throw Error('Something failed hard')
}

main()
$ node async3.js
> ... UnhandledPromiseRejectionWarning: Error: Something failed hard ...

$ echo $?
> 1

谢谢大家做我的橡皮鸭!

我认为使用异步函数时状态代码为 0 的原因是抛出异步方法会引发 Promise 拒绝,但严格意义上它不会抛出。错误包含在 Promise 拒绝中,这可能被认为是常规执行,毕竟这是有道理的,因此是成功状态代码。