Alexa Skills:sessionAttributes 工作原理及无法赋值问题排查
我太懂这种卡好几天的感觉了!之前我在做Alexa技能的时候也踩过sessionAttributes的坑,咱们从几个最容易出错的地方排查:
别搞混sessionAttributes的位置!
很多人会下意识把它放到response对象里,但实际上它是和version、response平级的顶层属性!正确的响应JSON结构应该是这样的:{ "version": "1.0", "sessionAttributes": { "favoriteColor": "blue", "lastQuery": "weather" }, "response": { "outputSpeech": { "type": "PlainText", "text": "已保存你的偏好" }, "shouldEndSession": false } }如果你用的是Alexa Skills Kit SDK(v2版本),不用手动拼JSON,直接用
handlerInput.attributesManager来设置,SDK会自动帮你把属性放到正确的位置:// 设置会话属性 handlerInput.attributesManager.setSessionAttributes({ favoriteColor: "blue" }); // 构建并返回响应 return handlerInput.responseBuilder .speak("已保存你的偏好") .withShouldEndSession(false) // 关键:要保持会话不结束,属性才会留存 .getResponse();检查会话是否被强制结束
如果你的响应里设置了shouldEndSession: true,Alexa会直接销毁当前会话,不管你设置了什么sessionAttributes都会丢失。所以只要你需要保留属性,一定要把这个参数设为false(或者在需要持续会话的场景下手动指定,避免默认值导致会话意外结束)。排查代码里的响应覆盖问题
有没有可能你在代码里不小心覆盖了整个响应对象?比如写了this.response = {...}这种代码,把SDK帮你维护的response对象替换成了自己的,导致之前设置的sessionAttributes被清空。这种情况一定要用SDK提供的responseBuilder来构建响应,不要直接赋值this.response。去控制台看真实的请求/响应日志
打开Alexa开发者控制台的测试页面,触发你的技能后,查看"Request"和"Response"标签页的完整JSON。看看Lambda返回的响应里到底有没有sessionAttributes字段,是字段不存在还是值为空——这一步能直接帮你定位是代码没生成属性,还是Alexa端的问题。
如果还是搞不定,把你的Lambda代码片段贴出来,咱们再针对性排查!
内容的提问来源于stack exchange,提问作者Unencoded

