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

太阳能数据记录器CSV接入AWS Lambda遇JSON解析错误求助

解决方案:处理application/x-www-form-urlencoded格式请求到Lambda

1. 修正API Gateway配置

API Gateway默认不会自动解析application/x-www-form-urlencoded格式的请求体,需手动添加映射模板:

  • 打开AWS API Gateway控制台,找到目标API和POST方法
  • 进入集成请求设置,找到映射模板
  • 点击"添加映射模板",输入application/x-www-form-urlencoded并确认创建
  • 模板内容填写:
    {
      "key": "$input.params('key')",
      "md5sum": "$input.params('md5sum')",
      "data": "$input.params('data')"
    }
    
  • 保存后重新部署API(未部署则配置不生效)

2. 修改Lambda代码适配解析后的请求

以下是Node.js环境的Lambda示例代码,直接从事件中获取解析后的表单字段,处理CSV并写入DynamoDB:

const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
  try {
    // 读取API Gateway映射后的表单字段
    const { key, md5sum, data } = event;

    // 处理CSV数据(根据实际格式调整分割逻辑)
    const csvRows = data.split('\n').filter(row => row.trim());
    if (csvRows.length === 0) {
      return { statusCode: 400, body: JSON.stringify({ error: 'CSV数据为空' }) };
    }

    // 准备DynamoDB批量写入请求
    const putRequests = csvRows.map((row, index) => {
      // 替换为你的CSV列分割逻辑,示例按逗号拆分
      const [timestamp, solarVoltage, current, power] = row.split(',');
      return {
        PutRequest: {
          Item: {
            recordId: `${key}-${Date.now()}-${index}`, // 生成唯一主键
            deviceKey: key,
            md5Checksum: md5sum,
            timestamp: timestamp,
            solarVoltage: parseFloat(solarVoltage),
            current: parseFloat(current),
            power: parseFloat(power),
            createdAt: new Date().toISOString()
          }
        }
      };
    });

    // 写入DynamoDB
    await dynamodb.batchWrite({
      RequestItems: {
        '你的DynamoDB表名': putRequests
      }
    }).promise();

    return {
      statusCode: 200,
      body: JSON.stringify({ message: `成功保存${csvRows.length}条数据` })
    };
  } catch (error) {
    console.error('处理失败:', error);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: error.message })
    };
  }
};

3. 备选方案:Lambda自行解析请求体

若不想修改API Gateway配置,可在Lambda中手动解析event.body的form-urlencoded内容:

const AWS = require('aws-sdk');
const querystring = require('querystring');
const dynamodb = new AWS.DynamoDB.DocumentClient();

exports.handler = async (event) => {
  try {
    // 手动解析form-urlencoded格式请求体
    const formData = querystring.parse(event.body);
    const { key, md5sum, data } = formData;

    // 后续CSV处理和DynamoDB写入逻辑与上述一致
  } catch (error) {
    console.error('处理失败:', error);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: error.message })
    };
  }
};

关键检查点

  • 确认数据记录器请求头包含Content-Type: application/x-www-form-urlencoded,否则API Gateway不会匹配映射模板
  • 验证Lambda执行角色拥有DynamoDB的PutItem或BatchWriteItem权限
  • 可通过Postman发送form-urlencoded请求模拟数据记录器,排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:53:27