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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 04:12:55