使用两个字段调用DynamoDB getItem报错,单字段可正常执行
解决DynamoDB getItem多字段报错问题
问题原因
DynamoDB的getItem接口对Key参数有严格限制:只能传入表定义的主键字段——要么是单个分区键(Partition Key),要么是分区键+排序键(Sort Key)的组合,不能加入任何非主键字段。你代码里在Key中加入了email,但它并不是表的主键(分区键/排序键)的一部分,因此触发了The provided key element does not match the schema错误。
解决办法
根据你的业务需求,有两种可行方案:
方案1:改用Query查询(推荐)
如果email是全局二级索引(GSI)的主键,用query接口可以高效定位数据:
const dynamoDB = new AWS.DynamoDB() const { email, password } = JSON.parse(event.body) try { const params = { TableName: process.env.DYNAMODB_USER_TABLE, IndexName: 'email-index', // 替换为你的GSI实际名称 KeyConditionExpression: 'email = :email', ExpressionAttributeValues: { ':email': { S: email } } } const result = await dynamoDB.query(params).promise(); return response(200, { message: 'Item found', Items: result.Items }) } catch (error) { return response(400, { error: error.message }) }
方案2:主键获取数据后校验email
如果email未建立索引,只能先通过primary_key拿到数据,再判断email是否匹配(仅适用于主键对应唯一数据的场景):
const dynamoDB = new AWS.DynamoDB() const { email, password } = JSON.parse(event.body) const id = '1' try { const params = { TableName: process.env.DYNAMODB_USER_TABLE, Key: { primary_key: { S: id } } } const result = await dynamoDB.getItem(params).promise(); if (!result.Item || result.Item.email.S !== email) { return response(404, { message: 'Email does not match' }) } return response(200, { message: 'Item found', Item: result.Item }) } catch (error) { return response(400, { error: error.message }) }
注意:无索引时用
scan接口全表查询email会严重影响性能,不推荐在生产环境使用。
内容的提问来源于stack exchange,提问作者Thiago Melo
相关产品推荐
相关产品推荐

