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
相关产品推荐
相关产品推荐

