Обещание не давать стека трассировки - PullRequest
0 голосов
/ 02 июля 2019

Я новичок в обещаниях и, вероятно, делаю что-то не так. Я делаю резервную копию экземпляра MongoDB, используя Mongodump. Все работает нормально, однако у меня возникла небольшая проблема с трассировкой стека. В функции, которую следует ожидать, используя async / await в основном процессе, я создаю новое обещание. В конце вызываемой функции (Вырежьте начало):

backupDB(collection) {
    return new Promise((resolve, reject) => {
        let backupLog = [];
        backupLog.push({
            time: moment(),
            msg: `Backup for ${collection} started`
        });            

        let spawnArguments = [
            '--host', 'localhost',
            '--port', portProd,
            '--collection', collection,
            '--db', dbNameProd,
            '--out', dumpPath
        ];

        const spawnprocess = spawn(mongodumpPath, spawnArguments,
            {shell: true}
        );

        spawnprocess.on('close', (code) => {
            if (code === 0) {
                backupLog.push({
                    time: moment(),
                    msg: `Backup for ${collection} finished`
                });                
                resolve(backupLog);
            } else {
                backupLog.push({
                    time: moment(),
                    msg: `Backup for ${collection} failed`
                }); 
                reject(backupLog);
            }
        });

Переменная mongodumpPath намеренно не определена (для демонстрации), но когда я запускаю функцию внутри try catch, ошибка не выдается:

    try {
        log = log.concat(await this.backupDB('ops', {regDate: {$gte: {$date: fromDate}, $lte: {$date: toDate}}})); 

    } catch (e) {
        log = log.concat(e);
        return log;
    }

Если я позвоню

this.backupDB('ops', {regDate: {$gte: {$date: fromDate}, $lte: {$date: toDate}}})

трассировка стека брошена в консоль. Я предполагаю, что это из-за того, что я только отклоняю ошибку, когда spawnprocess генерирует событие закрытия. Однако раньше программа вылетает, так как я могу это поймать?

Большое спасибо! :)

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Решено с помощью следующего улова:

        if (e.stack) {
            log.push({
                time: moment(),
                msg: e.stack
            });
        } else {
            log = log.concat(e);
        }
0 голосов
/ 02 июля 2019

При работе с обещаниями, если вызываемая функция возвращает обещание, вы должны иметь возможность добавить .catch к вызовам функции для обработки отклонения.

с вашим кодом это будет выглядеть как-тонапример:

let backupCall = await this.backupDB('ops', {regDate: {$gte: {$date: fromDate}, $lte: {$date: toDate}}})).catch((error) => console.log(error));
log = log.concat(backupCall) 

обратите внимание на catch, добавленный к строке вызова this.backupDB

...