QueryCommand对象中字符串模板失效问题排查与解决方法
DynamoDB QueryCommand 动态分区键模板失效的解决办法
我之前遇到一个问题:写了个要适配多张表的DynamoDB查询函数,每张表的分区键都不一样,所以不能硬编码分区键名称。但在构建QueryCommand参数时,ExpressionAttributeValues里用#${pKey}这种字符串模板设置动态键名完全不生效,属性值根本绑定不到参数上。
踩坑的初始代码
// pKey是传入的分区键名,比如"userId"或者"orderId" const params = { TableName: tableName, KeyConditionExpression: `${pKey} = :${pKey}`, ExpressionAttributeValues: { `#${pKey}`: partitionKeyValue // 这里的模板完全没起作用 } }; const command = new QueryCommand(params);
问题出在哪
JavaScript对象字面量里,直接写#${pKey}会被当作普通字符串键,不会解析模板里的变量。要让动态键名生效,必须用方括号把模板包起来才行。另外一开始的占位符写法也有点绕,反而容易搞混。
简化的解决办法
后来改成固定占位符的写法,直接避免动态键名的解析问题,代码还更简洁:
const params = { TableName: tableName, KeyConditionExpression: `${pKey} = :pk`, ExpressionAttributeValues: { ':pk': partitionKeyValue // 固定用:pk当值占位符,不用跟着键名变 } }; const command = new QueryCommand(params);
要是你非得让占位符和分区键名对应,也可以用方括号包裹动态键名,这样模板就能正常解析了:
const params = { TableName: tableName, KeyConditionExpression: `${pKey} = :${pKey}`, ExpressionAttributeValues: { [`:${pKey}`]: partitionKeyValue // 方括号包裹后,模板才会生效 } };
两种写法都能解决问题,而且保证了函数可以在不同表之间复用,不用改硬编码的分区键。
内容的提问来源于stack exchange,提问作者worstDev
相关产品推荐
相关产品推荐

