You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何验证数据库保存与API调用是否执行成功?

修正异步操作成功验证的方案

原代码的判断逻辑仅检查函数是否存在,完全无法验证两个异步操作是否执行成功。由于异步函数执行失败时会抛出异常,我们可以通过跟踪操作状态+捕获异常的方式来实现正确的验证逻辑,同时还能处理不同的失败场景。

核心解决方案

  1. 用变量分别记录两个操作的成功状态
  2. 通过try-catch捕获异步操作的异常,避免流程崩溃
  3. 根据两个操作的实际执行结果返回对应响应

修改后的代码示例

// 初始化两个操作的成功状态
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:15:39