使用docClient调用DynamoDB query部分Lambda报错原因咨询
从你提供的错误片段和代码来看,这个报错的完整内容应该是:"Either the KeyConditions or KeyConditionExpression parameter must be specified in the request"——这是因为你混淆了DynamoDB中query()和get()方法的参数要求,导致部分场景下参数不匹配触发错误。
核心问题分析
你的代码里调用的是docClient.query(),但传入的params使用了Key字段——这个字段是给getItem()(或docClient.get())方法用的,用于根据完整的主键(分区键+排序键)获取单个项目。而query()方法的规则完全不同:它用于按分区键过滤(可选叠加排序键的条件)查询多个项目,必须指定KeyConditionExpression(推荐)或者旧版的KeyConditions参数,不能直接用Key。
为什么部分场景正常?
大概率是你在正常运行的Lambda里,实际调用的是docClient.get()而非docClient.query()——可能是代码复制时的疏忽,或者某个Lambda里的方法名被修改过,导致参数匹配成功;而报错的Lambda严格使用了query(),参数不匹配就触发了错误。
修复方案
根据你的业务需求选择对应的写法:
1. 如果只是要获取单个主键匹配的项目(你的代码逻辑看起来更像这个场景)
直接把query()改成get(),保持现有params不变即可:
const params = { TableName : tableName, Key: { publisherId: publisherId, // partition key id: publicationId // sort key } }; docClient.get(params, (err, data) => { callback({ err: err, params: params, data: data}); });
2. 如果确实需要执行Query操作(比如查询某个publisherId下的多个项目)
修改params为query()要求的格式,使用KeyConditionExpression和ExpressionAttributeValues:
const params = { TableName : tableName, KeyConditionExpression: "publisherId = :pid AND id = :pubId", // 若要查该publisher下所有项,可只写"publisherId = :pid" ExpressionAttributeValues: { ":pid": publisherId, ":pubId": publicationId } }; docClient.query(params, (err, data) => { callback({ err: err, params: params, data: data}); });
额外验证建议
可以在报错的Lambda里打印完整的错误信息(比如console.log(err.message)),确认是不是我们提到的完整错误文本,这能进一步验证问题根源。
内容的提问来源于stack exchange,提问作者Arsenii Fomin

