DynamoDB循环写入JSON列表数据时仅保存首条记录问题
问题原因
代码仅成功写入第一条数据的核心原因是:return response语句被放在了for...of循环块内部。第一次循环完成第一个URL的API调用、DynamoDB写入后,就会直接执行return终止整个Lambda handler函数,后续所有URL的遍历逻辑根本不会被执行。
修复步骤
- 移除循环内部的return逻辑,将最终响应返回的代码移到所有URL遍历、处理、写入流程全部完成之后
- 给单个URL的处理逻辑加独立错误捕获,避免某一个URL请求/写入失败直接打断整个批量任务
- 增加成功/失败计数,最终响应里返回批量处理的统计结果,方便排查问题
- 如果URL列表长度较大,需要同步调整Lambda函数的超时时间配置,避免函数超时导致部分数据未处理完成
修复后完整代码
exports.putItemHandler = async (event) => { const { body, httpMethod, path } = event; if (httpMethod !== 'POST') { throw new Error(`postMethod only accepts POST method, you tried: ${httpMethod} method.`); } console.log('received:', JSON.stringify(event)); console.log('----STARTING LOOP----') console.log(v4()) console.log(urls) // 批量处理结果统计 const processResult = { successCount: 0, failCount: 0, failUrls: [] } try { for (const url of urls) { try { const _id = v4(); const resp = await axios.get(endpoint, { params: { key: API_KEY, url: url } }); console.log(`URL ${url} 接口返回:`, JSON.stringify(resp.data)) const lighthouseResults = resp.data; const params = { TableName: tableName, Item: { id: _id, created_at: new Date().toISOString(), URL: url, fullJson: lighthouseResults, }, }; await docClient.put(params).promise(); processResult.successCount++; } catch (itemErr) { console.error(`处理URL ${url} 失败:`, itemErr); processResult.failCount++; processResult.failUrls.push(url); } } // 所有循环执行完之后再构造返回响应 const response = { statusCode: 200, body: JSON.stringify({ msg: '批量处理完成', processResult }), }; console.log(`response from: ${path} statusCode: ${response.statusCode} body: ${response.body}`); return response; } catch (err) { console.error('批量任务全局错误:', err) return { statusCode: 500, body: JSON.stringify({msg: '批量任务执行异常', error: err.message}) } } };
内容的提问来源于stack exchange,提问作者Trey Copeland
相关产品推荐
相关产品推荐

