太阳能数据记录器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
相关产品推荐
相关产品推荐

