通过API写入AWS DynamoDB遇阻:Lambda无法读取URL参数
解决Lambda接收API Gateway参数写入DynamoDB的问题
看起来你已经离解决问题很近了!从你打印的event内容来看,问题核心出在参数的读取路径上——你的API Gateway没有使用Lambda Proxy集成,所以请求的查询参数并没有被包装在queryStringParameters里,而是直接挂载在event的根节点上。
问题分析
你之前的代码尝试读取event.queryStringParameters["tempid"],但实际event的结构是{"tempid": "hottub1"},自然会抛出Cannot read property 'tempid' of undefined的错误,因为queryStringParameters这个属性根本不存在。
解决方案
直接修改参数的读取方式,同时补充温度字段的写入逻辑(毕竟你最终要存储温度数据),还要增加参数校验避免后续报错:
const AWS = require('aws-sdk'); const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'}); exports.handler = (event, context, callback) => { // 先校验必要参数是否存在 const tempid = event.tempid; const temperature = event.temperature; // 假设树莓派会传递这个温度参数 if (!tempid || !temperature) { callback(null, { statusCode: '400', body: JSON.stringify({ error: '缺少必要参数:tempid 或 temperature' }) }); return; } dynamodb.putItem({ TableName: "temperature", Item: { "tempid": { S: tempid }, "temperature": { N: temperature.toString() }, // 温度是数字类型,需用N标识并转为字符串 "timestamp": { S: new Date().toISOString() } // 可选:添加时间戳记录数据上报时间 } }, function(err, data) { if (err) { console.error('写入DynamoDB失败:', err); callback(null, { statusCode: '500', body: JSON.stringify({ error: '数据写入失败', details: err.message }) }); } else { callback(null, { statusCode: '200', body: JSON.stringify({ message: `成功接收来自${tempid}的温度数据`, temperature: temperature }) }); } }); };
额外说明
- 关于API Gateway参数映射:如果后续你想切换成Lambda Proxy集成(这种方式更灵活,能获取完整的请求头、路径等信息),可以在API Gateway的集成设置里开启"Use Lambda Proxy integration",此时参数就会出现在
event.queryStringParameters里,你的最初代码调整后就能使用。但目前你的配置是非Proxy集成,直接读取event根节点的参数即可。 - DynamoDB数据类型:DynamoDB是强类型数据库,数字类型需要用
{ N: 值的字符串形式 },不能直接传数字,所以代码里用了temperature.toString()做转换。 - 参数校验:增加参数校验能提前拦截无效请求,避免不必要的DynamoDB调用,也能给树莓派更清晰的错误反馈。
内容的提问来源于stack exchange,提问作者AdamCodes716
相关产品推荐
相关产品推荐

