AWS Lambda查询DynamoDB返回null问题排查求助
问题原因及解决方案
核心问题:异步处理逻辑错误
你的Lambda函数返回null的主要原因是混合使用了async/await与回调函数,且外层handler未返回有效结果:
- 使用
await调用ddb.query时,无需传入回调函数——此时ddb.query会返回一个Promise,成功时resolve为查询数据,失败时reject为错误对象。 - 你代码里回调函数内部的
return err或return data,只是回调自身的返回值,不会传递到外层async handler中;而外层handler最后没有任何return语句,所以默认返回null。
修复后的代码
方案1:正确使用async/await(推荐)
改用DocumentClient可以省去手动指定数据类型的麻烦,代码更简洁:
const AWS = require('aws-sdk'); AWS.config.update({region: process.env.REGION}); // 使用DocumentClient,无需手动声明{S: id}这类数据类型 const ddb = new AWS.DynamoDB.DocumentClient(); exports.handler = async (event, context) => { try { const { id, owner } = event; const params = { TableName: process.env.TABLE_NAME, KeyConditionExpression: "id = :id and owner = :owner", ExpressionAttributeValues: { ":id": id, ":owner": owner, } }; // 直接await Promise获取结果并返回 const data = await ddb.query(params).promise(); return data; } catch (err) { console.error('查询失败:', err); return err; } };
方案2:坚持使用回调函数(不推荐,async场景下更适合Promise)
如果一定要用回调,需改用Lambda的回调机制,去掉async关键字:
const AWS = require('aws-sdk'); AWS.config.update({region: process.env.REGION}); const ddb = new AWS.DynamoDB(); exports.handler = (event, context, callback) => { const { id, owner } = event; const params = { TableName: process.env.TABLE_NAME, KeyConditionExpression: "id = :id and owner = :owner", ExpressionAttributeValues: { ":id": { S: id }, ":owner": { S: owner }, } }; ddb.query(params, function(err, data) { if (err) { callback(err); } else { callback(null, data); } }); };
额外检查项
- 确认Lambda执行角色拥有
dynamodb:Query权限,权限不足会导致查询失败,但此时函数会返回错误而非null。 - 确认环境变量
REGION和TABLE_NAME配置正确,指向目标DynamoDB表的所在区域和表名。
内容的提问来源于stack exchange,提问作者Baslki
相关产品推荐
相关产品推荐

