Lambda查询DynamoDB无返回结果的参数配置问题排查
问题原因
你遇到的查询无返回的问题是由两个核心错误导致的:
- 返回字段取值错误
DynamoDB的query查询接口会返回多条匹配的记录,结果存放在返回对象的data.Items(复数,数组类型)属性中,你代码中访问的data.Item是单数属性,该属性不存在,所以输出为undefined。如果确认只会返回一条记录,可以取data.Items[0],如果有多条符合条件的记录,遍历data.Items数组即可。 - 查询逻辑判断错误
你当前的错误回调仅会在查询请求本身执行失败时触发(如参数非法、权限不足、服务异常等),如果查询正常执行但没有匹配到记录,会正常进入成功回调,仅data.Items为空数组,不会走到你写的No records found逻辑分支。 - (可选优化项)别名使用不规范
你在ExpressionAttributeNames中已经声明了#LN为Lname的别名,但KeyConditionExpression直接使用了原始字段名Lname,虽然此处没有触发保留字冲突不会报错,但规范写法应该统一使用别名,避免后续字段名碰到DynamoDB保留字时出现异常。
修复后的代码示例
查询参数调整(可选优化)
params = { TableName: "Customers", IndexName: "LastNameIndex", ExpressionAttributeNames: { "#FN": "Fname", "#LN": "Lname", "#DB": "Dob" }, ExpressionAttributeValues: { ":a": { S: "Connors" } }, KeyConditionExpression: "#LN = :a", // 改用统一别名 ProjectionExpression: "#FN, #LN, #DB" };
查询执行代码调整
ddb.query(params).promise().then( function(data) { // 从Items数组取匹配结果 if (data.Items.length > 0) { console.log("Customer:", data.Items) // 仅需要第一条记录的话取 data.Items[0] return data.Items; } else { console.log("No records found...") return []; } }, function(err) { // 仅处理请求执行类错误 console.error("查询请求执行失败:", err) });
内容的提问来源于stack exchange,提问作者DavidC
相关产品推荐
相关产品推荐

