Lex聊天机器人存储用户数据至DynamoDB失败:表已创建但无数据
排查Lex聊天机器人DynamoDB数据未存储问题
看起来你的代码逻辑方向是对的,但数据没写入DynamoDB通常是异步调用、权限或配置问题导致的,我帮你梳理几个关键排查点:
1. 修复代码中的异步调用缺失
AWS SDK v2的DynamoDB DocumentClient方法默认返回的是Request对象,不是Promise,直接用await不会触发实际的写入操作。你需要在put方法后加上.promise()才能让await等待操作完成。
修改后的完整代码:
'use strict'; const { v1: uuidv1 } = require('uuid'); const AWS = require('aws-sdk'); const dynamo = new AWS.DynamoDB.DocumentClient(); module.exports.saveBookingToDatabase = async function(Arrival_city, Departure_city, Flight_type, Phone_number){ console.log('saveBookingToDatabase'); // 打印传入参数,确认数据是否正确接收 console.log('Received booking data:', {Arrival_city, Departure_city, Flight_type, Phone_number}); const item = {}; item.bookingId = uuidv1(); item.arrivalCity = Arrival_city; item.departureCity = Departure_city; item.classType = Flight_type; item.phone = Phone_number; const params = { TableName: 'air_stallion', Item: item }; try { // 关键修复:添加.promise()触发异步写入 let result = await dynamo.put(params).promise(); console.log(`Successfully saved ticket: ${JSON.stringify(item)}`); console.log('DynamoDB response:', result); return item; } catch(e) { // 打印详细错误日志,方便定位问题 console.error('Error saving to DynamoDB:', JSON.stringify(e, null, 2)); throw e; } }
2. 检查IAM权限配置
如果你的代码运行在Lambda中(Lex通常会触发Lambda处理请求),必须确保Lambda的执行角色拥有DynamoDB的PutItem权限:
- 打开IAM控制台,找到Lambda对应的执行角色
- 添加如下权限策略(替换占位符为你的实际AWS区域和账号ID):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "dynamodb:PutItem", "Resource": "arn:aws:dynamodb:你的AWS区域:你的AWS账号ID:table/air_stallion" } ] }
3. 验证DynamoDB表配置
- 确认表名
air_stallion完全匹配(虽然DynamoDB表名不区分大小写,但保持代码与控制台一致能避免不必要的问题) - 检查表的主键:你的代码用
bookingId作为主键,确保表的主键是字符串类型的分区键,且名称为bookingId。主键不匹配会导致写入操作静默失败。
4. 确认函数被正确调用
- 借助添加的参数日志,确认Lex传递的
Arrival_city等参数不是undefined或空值 - 检查Lex的意图配置,确保流程正确触发了保存函数的调用,没有在中途提前终止
通过以上步骤,应该能定位到数据未写入的原因。如果还是有问题,查看CloudWatch日志里的错误信息,里面会给出更具体的失败原因(比如权限不足、表不存在等)。
内容的提问来源于stack exchange,提问作者Tayyab
相关产品推荐
相关产品推荐

