Консольное асинхронное приложение node.js "Best Practice" - PullRequest
0 голосов
/ 05 ноября 2018

Периодически мне приходится писать консольные приложения 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);
    }
});

1 Ответ

0 голосов
/ 05 ноября 2018

Это цель события 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;
    }
})();
...