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

尝试从Lex向DynamoDB插入数据时遇TypeError错误求助

问题排查与解决

错误原因

报错Cannot read properties of undefined (reading 'slots')是因为代码尝试访问intent.currentIntent.slots时,intent.currentIntent为undefined。核心原因有两种可能:

  • 你使用的是Amazon Lex V2,但代码按照Lex V1的请求结构编写(V1用event.currentIntent,V2用event.sessionState.intent)。
  • Lambda接收到的Lex请求事件中,currentIntent字段未正确传递(可查看CloudWatch日志中console.log(event)的输出确认结构)。

修复步骤

1. 添加空值保护(避免崩溃)

在访问关键字段前加入检查,防止未定义导致的报错:

function userRegistration(event, callback) {
    let userInfo = {};
    // 兼容Lex V1和V2的intent结构
    const intent = event.currentIntent || event.sessionState?.intent;
    const sessionAttributes = event.sessionAttributes || event.sessionState?.sessionAttributes || {};

    if (!intent) {
        callback(close(sessionAttributes, 'Failed',
            {'contentType': 'PlainText', 'content': "无法获取注册信息,请重试。"}));
        return;
    }

    const slots = intent.slots;
    if (!slots) {
        callback(close(sessionAttributes, 'Failed',
            {'contentType': 'PlainText', 'content': "未获取到注册所需信息,请重试。"}));
        return;
    }

    // 处理slot数据
    Object.keys(slots).forEach((item) => {
        // 兼容V1直接取值、V2从value.originalValue取值的差异
        const slotValue = slots[item]?.value?.originalValue || slots[item];
        if (slotValue) {
            userInfo[item] = {"S": slotValue};
        }
    });

    // 写入注册日期
    userInfo.registration_date = {"S": new Date().getTime().toString()};
    // 从slot中提取邮箱(如果邮箱是注册slot之一)
    const userEmail = slots.UserEmail?.value?.originalValue || slots.UserEmail;
    if (userEmail) {
        userInfo.UserEmail = {"S": userEmail};
    }

    // 后续DynamoDB操作代码不变
    dynamodb.putItem({
        "TableName": tableName,
        "Item" : userInfo
    }, function(err, data) {
        if (err) {
            console.log('Failure storing user info');
            console.log(err);
            callback(close(sessionAttributes, 'Fulfilled',
            {'contentType': 'PlainText', 'content': "抱歉,保存注册信息时出错,请重试。"}));
        } else {
            console.log("Successfully Stored UserInfo");
            callback(close(sessionAttributes, 'Fulfilled',
            {'contentType': 'PlainText', 'content': "感谢您注册我们的服务。"}));
        }
    });
}

2. 适配Lex V2结构(如果使用V2版本)

如果确认使用Lex V2,可直接按V2结构修改代码,避免兼容逻辑:

function userRegistration(event, callback) {
    let userInfo = {};
    const sessionAttributes = event.sessionState?.sessionAttributes || {};
    const intent = event.sessionState?.intent;

    if (!intent || !intent.slots) {
        callback(close(sessionAttributes, 'Failed',
            {'contentType': 'PlainText', 'content': "无法获取注册信息,请重试。"}));
        return;
    }

    // 遍历V2的slots,提取实际值
    Object.keys(intent.slots).forEach((slotName) => {
        const slot = intent.slots[slotName];
        if (slot?.value?.originalValue) {
            userInfo[slotName] = {"S": slot.value.originalValue};
        }
    });

    userInfo.registration_date = {"S": new Date().getTime().toString()};
    // 从slot中获取邮箱
    const userEmail = intent.slots.UserEmail?.value?.originalValue;
    if (userEmail) {
        userInfo.UserEmail = {"S": userEmail};
    }

    // DynamoDB操作代码不变
    dynamodb.putItem({
        "TableName": tableName,
        "Item" : userInfo
    }, function(err, data) {
        if (err) {
            console.log('Failure storing user info');
            console.log(err);
            callback(close(sessionAttributes, 'Fulfilled',
            {'contentType': 'PlainText', 'content': "抱歉,保存注册信息时出错,请重试。"}));
        } else {
            console.log("Successfully Stored UserInfo");
            callback(close(sessionAttributes, 'Fulfilled',
            {'contentType': 'PlainText', 'content': "感谢您注册我们的服务。"}));
        }
    });
}

3. 验证事件结构

查看CloudWatch中Lambda的日志,找到console.log(event)输出的内容,确认:

  • 如果是Lex V1结构,检查currentIntent字段是否存在;
  • 如果是Lex V2结构,检查sessionState.intent字段是否存在。

额外注意事项

  • 确保DynamoDB表GenAITestDemo的主键与你插入的UserEmail(或其他字段)匹配,避免主键缺失导致写入失败;
  • Lambda的IAM角色需具备dynamodb:PutItem权限,否则会出现权限错误。

内容的提问来源于stack exchange,提问作者Raja

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:03:20