在for循环中更新DynamoDB表失败,寻求技术帮助
Telegram机器人DynamoDB时间戳更新失效排查与修复
核心问题定位
你的代码里存在一个逻辑错误,导致DynamoDB无法找到要更新的用户条目:
在docClient.update的Key配置中,你写了"001" + userIds[i],但你的userIds数组元素本身已经是"0016027688931"这种前缀带001的字符串,拼接后会生成"0010016027688931"这种不存在的用户ID。而DynamoDB的Update操作默认允许更新不存在的条目(会静默创建新条目,除非添加条件限制),所以不会抛出错误,最终表现为消息发送成功但时间戳未更新。
修复方案
- 修正用户ID拼接逻辑
直接使用userIds[i]作为USER_ID的值,因为它本身已经包含正确的前缀:
await docClient .update({ TableName: "EXMPLE", Key: { USER_ID: userIds[i], // 去掉多余的"001"拼接 }, UpdateExpression: "SET LAST_SEEN = :s", ExpressionAttributeValues: { ":s": Math.floor(Date.now() / 1000), }, }) .promise();
- 添加存在性校验(可选但推荐)
为了避免创建无效的用户条目,同时在找不到用户时抛出错误便于排查,可以添加ConditionExpression:
await docClient .update({ TableName: "EXMPLE", Key: { USER_ID: userIds[i], }, UpdateExpression: "SET LAST_SEEN = :s", ExpressionAttributeValues: { ":s": Math.floor(Date.now() / 1000), }, ConditionExpression: "attribute_exists(USER_ID)", // 仅当条目存在时才执行更新 }) .promise();
额外排查方向
- 确认DynamoDB表名
EXMPLE是否和实际表名完全一致(DynamoDB表名区分大小写) - 检查表中
LAST_SEEN字段的类型是否为数字,确保和你传入的时间戳(整数)匹配 - 查看Lambda的CloudWatch日志,搜索DynamoDB相关的请求日志,确认更新操作的返回结果是否符合预期
内容的提问来源于stack exchange,提问作者Andrew Atwood
相关产品推荐
相关产品推荐

