在promise对象的then()函数内部存在的return语句不会将值返回给Alexa模拟器,而是在.then()外部工作

时间:2018-12-24 05:21:42

标签: node.js mongodb mongoose alexa alexa-skills-kit

我正在尝试从mongo db获取值,并在alexa仿真器的答复中填充获取的值。

使用的alexa sdk版本是最新的v2.0,ask-sdk。

使用alexa-skill-local和lambda函数进行了测试。

下面的return语句按预期工作

return handlerInput.responseBuilder
                    .speak("test")
                    .reprompt("test")
                    .withSimpleCard('Innovation details', "test")
                    .getResponse();

具有上述return语句的结果如下所示

{
"body": {
    "version": "1.0",
    "response": {
        "outputSpeech": {
            "type": "SSML",
            "ssml": "<speak>test</speak>"
        },
        "card": {
            "type": "Simple",
            "title": "Innovation details",
            "content": "test"
        },
        "reprompt": {
            "outputSpeech": {
                "type": "SSML",
                "ssml": "<speak>test</speak>"
            }
        },
        "shouldEndSession": false
    },
    "sessionAttributes": {},
    "userAgent": "ask-node/2.3.0 Node/v8.12.0"
}

}

我编写了一个函数ops(),它将从云图集中托管的mongodb中检索值。检索到的字符串将用作语音文本和提示文本。但是由于javascript是异步的,并且涉及到猫鼬调用,所以我尝试编写async / await函数,回调地狱,最后保证函数返回db值。 db调用位于promise对象内部,return语句位于.then()内部,如下所示。使用alexa-skill-local运行时,控制台语句在控制台中填充正确的结果,并且控制台中未报告任何错误。通过lambda函数运行也不会产生任何错误。

ops(handlerInput).then(function(data){
                console.log("in promise then "+data.speechText);
                var handlerInput=data.input;
                return handlerInput.responseBuilder
                    .speak(data.speechText)
                    .reprompt(data.speechText)
                    .withSimpleCard('Innovation details', data.speechText)
                    .getResponse();
            }) .catch(error => console.log(error));

传递的解析对象为:

var passer={
                            "input": handlerInput,
                            "speechText":speechText
           };

使用alexa-skill-local时,控制台语句按预期运行,但return语句未向alexa仿真器返回值。返回的JSON为

{
"body": {
    "version": "1.0",
    "response": {},
    "sessionAttributes": {},
    "userAgent": "ask-node/2.3.0 Node/v8.12.0"
}

}

请帮助我将值返回给Alexa模拟器

1 个答案:

答案 0 :(得分:0)

感谢您的回复。这些答复帮助我确定了解决方案。

我在promise对象的前面放了一个收益。现在,意图处理程序正在返回Promise对象。