Alexa技能Lambda Handler报错:KeyError 'session' 求助
解决Alexa Lambda函数中的KeyError: 'session'问题
看起来你遇到的问题是Lambda函数在尝试访问event['session']时找不到这个键,这通常是因为测试时传入的请求JSON不完整,或者你没有使用符合Alexa技能规范的请求结构。
问题原因分析
你的代码直接假设event对象里一定包含session字段,但如果测试时的输入只是单独的session片段(就像你提供的那样),而不是完整的Alexa请求结构,Lambda自然会抛出KeyError。Alexa发送给Lambda的请求是一个包含version、session、request等顶级字段的完整JSON对象,缺少任何一个都会导致代码报错。
解决方案
1. 使用完整的Alexa请求JSON进行测试
你需要把session部分放到完整的Alexa请求结构中,下面是一个可以直接用于测试的示例:
{ "version": "1.0", "session": { "new": true, "sessionId": "amzn1.echo-api.session.894e0116-055a-4307-8574-7059a24e8219", "application": { "applicationId": "amzn1.ask.skill.d01d3328-ce02-4357-9605-bb12d5cafce2" }, "user": { "userId": "amzn1.ask.account.AH7BOSFTFR54XGKQ3MYAK2LHCRK4CV5PUIS65HQWC4OY5B6NIBWJJSUJH73PBDZAG3KTPFI4QS7TYCZPRETM267GW3PVBJFSYXBAGTCH5YYKA2MUFAN43PFB4CNQD6M7QX5DWLC5AEGBDRR3SIH7SHJOFBAR3QWCOIYZLZ3D4Q7Z3SPCGVLRF3CCMQAOGUEAAGJMIHWVT6ADKCQ" } }, "request": { "type": "LaunchRequest", "requestId": "amzn1.echo-api.request.12345678-1234-1234-1234-123456789012", "timestamp": "2024-05-20T12:00:00Z" } }
把这个完整的JSON放到Lambda控制台的测试事件中,再运行测试应该就能正常访问event['session']了。
2. 给代码增加容错处理
为了避免类似的KeyError,建议在代码中增加判断,或者使用.get()方法来安全访问嵌套字段,同时可以开启print(event)来调试实际传入的请求内容:
def lambda_handler(event, context): """ App entry point """ print(event) # 开启这个打印,查看实际传入的event结构 # 安全检查session是否存在 if event.get('session', {}).get('new'): on_session_started() # 同样安全处理request字段 request_type = event.get('request', {}).get('type') if request_type == "LaunchRequest": return on_launch(event.get('request', {})) elif request_type == "IntentRequest": return on_intent(event.get('request', {}), event.get('session', {})) elif request_type == "SessionEndedRequest": return on_session_ended()
这样即使event结构不符合预期,也不会直接抛出KeyError,而是能优雅处理。
3. 使用Lambda的Alexa测试模板
在Lambda控制台创建测试事件时,选择Alexa Skills Kit的模板(比如"Alexa Start Session"),这样会自动生成符合规范的请求结构,你只需要替换对应的applicationId和userId即可,不用手动构造JSON。
内容的提问来源于stack exchange,提问作者viking1888
相关产品推荐
相关产品推荐

