Lambda中DynamoDB scan返回null结果问题排查
问题定位结论
Scan操作读不到数据由两处代码错误导致,和表配置、Lambda权限无关:
- 第一处是Scan调用写法错误,第二处是Put写入的参数结构错误,两处问题叠加导致你读不到预期数据。
1. Scan代码的问题
你当前的Lambda代码有两个细节错误:
- 调用DocumentClient的API时,没有加
.promise()方法,await实际等待的不是DynamoDB返回的真实结果,而是一个未触发的请求对象 - 函数没有返回任何值,Lambda执行完默认返回null,和你看到的返回现象完全一致;另外DynamoDB Scan返回的真实数据是存在响应对象的
Items字段里,直接打印整个响应对象也看不到你要的条目内容。
修正后的Scan代码:
const AWS = require('aws-sdk'); const ddb = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'}); exports.handler = async function(event, context) { const result = await ddb.scan({ TableName: "DynamoDB_Project", Limit: 1, }).promise(); // 真实数据存在Items数组下 console.log("查询到的条目:", result.Items); return result.Items; }
2. Put写入代码的问题
你用的put方法参数结构完全不符合SDK要求:DynamoDB DocumentClient的put操作,除了表名之外的所有待写入条目内容,必须放在Item字段下,你现在直接把DateTempHumid作为和TableName平级的顶层参数传入,SDK会直接忽略这个非法字段,这段代码根本不会把你预期的温湿度数据写入表中。你在控制台看到的已有数据,是其他路径写入的,和这段put代码无关。
另外你原代码里还把湿度的英文拼错了,Humidty正确拼写是Humidity,后续写查询逻辑的时候要注意字段名一致。
修正后的Put代码:
await ddb.put({ TableName: "DynamoDB_Project", Item: { // 注意:这里必须替换为你建表时设置的主键字段,比如你的分区键如果是RecordId,就传入对应的唯一值,否则put操作会直接报错 DateTempHumid: { Date: event.date, Humidity: event.humidity, Temperature: event.temperature }, } }).promise();
补充验证方式:你可以先在控制台手动插入一条带正确主键的测试数据,用修正后的Scan代码测试,确认能读到数据之后,再用修正后的Put代码写入新数据,就能正常读到写入的内容了。
内容的提问来源于stack exchange,提问作者Brandon Graze
相关产品推荐
相关产品推荐

