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

AWS Lambda中多Async/Await Promise失效,请求代码重构协助

AWS Lambda中fetch失效问题的修复与代码重构

原代码的核心问题

  • forEach搭配异步回调:forEach不会等待内部的异步函数执行完成,Lambda执行到forEach结束后就会直接终止,导致callPSI里的请求和日志都来不及执行。
  • callPSI异步处理错误:标记为async但内部没使用await,用then链却没返回Promise,Lambda感知不到异步操作的完成;另外函数内部重新定义url变量,覆盖了传入的参数,请求地址被固定死。
  • 无异常捕获:请求失败时没有任何日志,无法排查问题。

重构后的完整代码

export async function consumer(event, context) {
    // 将每个record的处理转为Promise,存入数组
    const taskPromises = event.Records.map(async (record) => {
        const body = JSON.parse(record.body);
        api_url.searchParams.append("url", body.url);
        await callPSI(api_url.href);
        // 清空参数,避免多个record处理时参数叠加
        api_url.searchParams.delete("url");
    });

    // 等待所有异步任务完成,确保Lambda不会提前结束
    await Promise.all(taskPromises);
}

export const callPSI = async (url) => {
    try {
        // 用await处理fetch请求,替代then链
        const response = await fetch(url);
        // 检查响应是否成功,避免解析错误响应
        if (!response.ok) {
            throw new Error(`请求失败,状态码:${response.status}`);
        }
        console.log("response: ", response);
        const data = await response.json();
        console.log('data: ', data);
        return data; // 可选:返回数据供后续业务使用
    } catch (error) {
        // 捕获错误并打印,CloudWatch能看到错误日志
        console.error('callPSI执行出错:', error);
        throw error; // 抛出错误让上层处理(可选)
    }
};

关键修改说明

  • consumer函数:

    • 放弃forEach,改用map生成Promise数组,这样能追踪每个异步任务的状态。
    • 用Promise.all等待所有任务完成,保证Lambda在所有请求处理完后再终止,日志能正常输出到CloudWatch。
    • 每次处理完一个record后清空api_url的参数,防止多个record的url参数叠加导致请求地址错误。
  • callPSI函数:

    • 删除了覆盖传入参数的const url = "..."(如果确实需要固定请求地址,可改名为targetUrl避免冲突)。
    • 用await替代then链,异步流程更清晰,同时确保函数会等待请求完成后再返回。
    • 增加响应状态检查,避免在请求失败时强行解析响应体导致报错。
    • 添加try/catch捕获异常,错误日志会输出到CloudWatch,方便排查问题。

内容的提问来源于stack exchange,提问作者Trey Copeland

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:08:24