如何验证数据库保存与API调用是否执行成功?
修正异步操作成功验证的方案
原代码的判断逻辑仅检查函数是否存在,完全无法验证两个异步操作是否执行成功。由于异步函数执行失败时会抛出异常,我们可以通过跟踪操作状态+捕获异常的方式来实现正确的验证逻辑,同时还能处理不同的失败场景。
核心解决方案
- 用变量分别记录两个操作的成功状态
- 通过
try-catch捕获异步操作的异常,避免流程崩溃 - 根据两个操作的实际执行结果返回对应响应
修改后的代码示例
// 初始化两个操作的成功状态 let calendarCreated = false; let dbSaved = false; try { // 执行日历条目创建,成功后标记状态 await this.createMSCalendarEntry(dates.start, dates.end, currentUser.FirstName, currentUser.Id, currentUser.Email); calendarCreated = true; // 执行数据库保存,成功后标记状态 await this.dataService.TimesRepo.save(vacationDays); dbSaved = true; } catch (error) { // 记录错误日志,便于后续排查问题 console.error("假期提交流程出错:", error); } // 根据操作结果生成响应内容 let responseMessage: string; let statusCode = 200; if (calendarCreated && dbSaved) { responseMessage = 'Vacation submitted'; } else if (!calendarCreated && dbSaved) { responseMessage = 'Vacation saved to database but calendar entry failed'; statusCode = 500; } else if (calendarCreated && !dbSaved) { responseMessage = 'Calendar entry created but vacation could not be saved to database'; statusCode = 500; } else { responseMessage = 'Vacation could not be submitted'; statusCode = 500; } res.status(statusCode).send({ message: responseMessage, data: vacationDays, success: calendarCreated && dbSaved }); return;
进阶优化:保证操作原子性(可选)
如果需要确保两个操作要么都成功、要么都失败(避免出现“日历创建成功但数据库保存失败”的不一致状态),可以添加回滚逻辑:
let calendarEventId: string | undefined; let dbSaved = false; let responseMessage = 'Vacation submitted'; let statusCode = 200; try { // 创建日历条目并获取事件ID const graphResponse = await this.createMSCalendarEntry(dates.start, dates.end, currentUser.FirstName, currentUser.Id, currentUser.Email); calendarEventId = graphResponse.id; // 保存到数据库 await this.dataService.TimesRepo.save(vacationDays); dbSaved = true; } catch (error) { console.error("假期提交出错:", error); statusCode = 500; // 如果日历已创建但数据库保存失败,尝试删除已创建的日历条目 if (calendarEventId) { try { await this.deleteMSCalendarEntry(calendarEventId); console.log("已回滚日历条目"); } catch (rollbackError) { console.error("回滚日历条目失败:", rollbackError); responseMessage = 'Vacation submission failed, and calendar entry rollback failed'; return; } } responseMessage = dbSaved ? 'Calendar entry failed but vacation saved' : 'Vacation could not be submitted'; } res.status(statusCode).send({ message: responseMessage, data: vacationDays, success: dbSaved && !!calendarEventId }); return;
注:需自行实现deleteMSCalendarEntry函数,调用Microsoft Graph API的事件删除接口。
内容的提问来源于stack exchange,提问作者user18460597
相关产品推荐
相关产品推荐

