承诺不给stacktrace

时间:2019-07-02 16:48:53

标签: javascript node.js promise async-await

我对诺言不熟悉,可能做错了什么。我正在使用Mongodump备份MongoDB实例。一切正常,但是我在stacktrace上遇到了一个小问题。在一个函数中,应在主进程中使用async / await等待该操作,我正在创建一个新的Promise。在该函数的结尾,我正在调用(删除开头):

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发出close事件时,我仅拒绝该错误。但是该程序之前崩溃了,那我该如何捕捉呢?

非常感谢! :)

2 个答案:

答案 0 :(得分:0)

通过以下捕获解决了这个问题:

        if (e.stack) {
            log.push({
                time: moment(),
                msg: e.stack
            });
        } else {
            log = log.concat(e);
        }

答案 1 :(得分:-1)

在处理promise时,如果要调用的函数返回promise,则应该可以在函数调用后附加.catch以处理拒绝。

您的代码看起来像:

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

注意在this.backupDB调用行后面附加catch