You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:42:31