开发Alexa技能调用DynamoDB数据时出现TypeError: Cannot read property 'type' of undefined
解决Alexa技能调用DynamoDB时的TypeError问题
咱们来拆解你遇到的核心问题:DynamoDB查询参数错误+Lambda响应格式不符合Alexa规范,这两个问题共同导致了TypeError: Cannot read property 'type' of undefined的报错,下面一步步帮你修复:
1. 修正DynamoDB查询参数
你当前的params把incident也塞进了Key里,但DynamoDB的Key只能包含表的主键(Partition Key)和排序键(Sort Key),incident作为普通属性绝对不能放在这里。假设你的表用date做主键、time做排序键,那正确的查询参数应该是这样:
let GetMachineStateIntent = (context, callback) => { // 只保留主键和排序键在Key中 var params = { TableName: "updatedincident", Key: { date: "2017-03-21", time: "07:38" } }; // 初始化DynamoDB客户端并执行查询 const dynamodb = new AWS.DynamoDB.DocumentClient(); dynamodb.get(params, (err, data) => { if (err) { console.error("查询DynamoDB出错:", err); callback(null, buildAlexaResponse("抱歉,获取事件记录时遇到了问题")); return; } // 根据查询结果返回对应响应 if (data.Item) { const incidentContent = data.Item.incident; callback(null, buildAlexaResponse(`查询到的事件是:${incidentContent}`)); } else { callback(null, buildAlexaResponse("没有找到对应时间的事件记录哦")); } }); };
2. 构建符合Alexa要求的响应格式
报错Cannot read property 'type' of undefined大概率是因为你的Lambda没有返回标准结构的响应。Alexa要求响应必须包含固定的JSON结构,比如outputSpeech、shouldEndSession等字段,你可以封装一个工具函数来生成合规响应:
// 生成Alexa标准响应的工具函数 function buildAlexaResponse(speechText) { return { version: "1.0", response: { outputSpeech: { type: "PlainText", text: speechText }, shouldEndSession: true } }; }
3. 额外注意事项
- 确保你的Lambda执行角色已经配置了访问DynamoDB的权限(比如
AmazonDynamoDBReadOnlyAccess),否则会触发权限报错; - 如果日期和时间是用户通过语音指定的,记得从Alexa请求的插槽中提取,而不是硬编码,比如通过
event.request.intent.slots.date.value获取用户说的日期。
按上面的调整后,你的技能应该就能正确调取DynamoDB的事件记录,并且返回符合要求的响应给Alexa了。
内容的提问来源于stack exchange,提问作者zuba
相关产品推荐
相关产品推荐

