首页 > 解决方案 > node.js 控制台异步应用“最佳实践”

问题描述

定期,我必须编写直接从 shell 运行的 node.js 控制台应用程序。他们不接受输入,他们会调用文件系统,进行数据库调用和其他异步类型的活动。关于如何设置托管服务器等的 node.js 应用程序的示例比比皆是,但对于调用异步进程的东西,等待它,然后在设置退出代码后退出。我很难找到我认为优雅的例子。

这是我现在如何解决这个问题的一个片段。任何 node.js 大师都有更简洁的方法来解决这个问题,或者这主要是“好的”吗?

const emitter = new EventEmitter();
emitter.on('exit', (err) => {
    if(err) {
        console.error(err instanceof Error ? err.message : err);
        process.exit(-1);
    } else {
        process.exit(0);
    }
});

setImmediate(async () => {
    try {
        await doSomeAsyncThing();
        emitter.emit('exit', null);
    } catch(e) {
        emitter.emit('exit', e);
    }
});

标签: node.jsconsoleeventemitter

解决方案


这就是unhandledRejection活动的目的。默认情况下,它会输出UnhandledPromiseRejectionWarning并预计会在未来的 Node 版本中导致异常。由于这是这里的意图,它可以是:

process.on('unhandledRejection', (err) => {
    console.error(err instanceof Error ? err.message : err);
    process.exit(-1);
});

(async () => {
    try {
        await doSomeAsyncThing();
        process.exit(0);
    } catch(e) {
        throw e;
    }
})();

推荐阅读