我对诺言不熟悉,可能做错了什么。我正在使用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事件时,我仅拒绝该错误。但是该程序之前崩溃了,那我该如何捕捉呢?
非常感谢! :)
答案 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