我正在使用Alexa Node.js sdk来实施一项技能。在会话开始时(以LaunchRequest
的意图),我想在会话属性中存储一些变量。根据{{3}},我正在使用this.attributes.key
存储会话属性。
const handlers = {
'LaunchRequest': function () {
database.startSession()
.then(data => {
// console.log(data); // data does have token
this.attributes.token=data.token;
// this.attributes['token']=data.token; // Tried this too
this.emit(':ask', responses.launch, responses.launchReprompt);
})
.catch(err => {
console.error(err);
this.emit(":ask", responses.error);
});
},
.... More handlers
}
但是,在启动命令中,出现此错误
所请求的技能响应出现问题
我在日志中没有看到错误。
这是我的回应(在Alexa测试开发人员控制台中可见)
{
"body": {
"version": "1.0",
"response": {
"outputSpeech": {
"type": "SSML",
"ssml": "<speak> Ok, exiting App. </speak>"
},
"shouldEndSession": true
},
"sessionAttributes": {},
"userAgent": "ask-nodejs/1.0.25 Node/v8.10.0"
}
}
与the blog here一样,sessionAttributes
应该包含我使用this.attributes
设置为会话变量的内容,但是在某种程度上是空的。
我该如何解决?
编辑:如果我在this.attributes
行中注释掉,则会正确收到欢迎消息。
这是我的startSession
函数,如果有帮助的话。
async function startSession() {
return {
token: await getToken(),
... More attributes
};
}
编辑2:我注意到非常奇怪的事情。如果我只是做this.attributes.token="foobar"
,则session属性会正确设置。因此,我假设我的async
函数存在问题。请注意,console.log(data)
仍使用token
属性正确打印数据。
编辑3:Cloudwatch日志
START RequestId:版本:$ LATEST 2018-08-15T14:00:47.639Z警告:未设置应用程序ID END RequestId:REPORT RequestId:持续时间:315.05 ms计费持续时间:400 ms内存大小:128 MB使用的最大内存:73 MB
START RequestId:版本:$ LATEST 2018-08-15T14:00:47.749Z警告:未设置应用程序ID 2018-08-15T14:00:48.564Z {令牌:'令牌',过滤器: 'foobar'} END RequestId:REPORT RequestId:持续时间: 849.98 ms计费时间:900 ms内存大小:128 MB使用的最大内存:74 MB START RequestId:版本:$ LATEST 2018-08-15T14:00:49.301Z警告:应用程序ID不是 设置END RequestId:REPORT RequestId: 持续时间:0.72 ms计费持续时间:100 ms内存大小: 128 MB已使用的最大内存:74 MB
答案 0 :(得分:1)
我们发现response
对象的最大大小为24kb
,reference1,reference2,reference3。
我的data
的大小比24kb
大得多。因此,会话属性没有被存储,并且导致了exit
的意图。解决方案是将其存储在DynamoDB
之类的数据库中。
特别积3 Will。