alexa响应无效/休息呼叫麻烦

时间:2017-09-26 02:43:18

标签: node.js rest aws-lambda alexa

我一直试图弄清楚我的lambda函数出了什么问题。我怀疑其余的电话,但我无法弄清楚为什么alexa不接受输出。我已经添加了一些更多的console.logs,似乎它永远不会离开TrashPickUpIntent。这是代码:

'use strict';
const Alexa = require('alexa-sdk');
const https = require('https');


var handlers = {
    'LaunchRequest': function () {
        this.emit('SayHello');
    },
    'HelloWorldIntent': function () {
        this.emit('SayHello')
    },
    'TrashPickUpIntent' : function () {
        console.log("inside trash pick up intent");
        this.emit('trashPickUp');
    },
    'SayHello': function () {
        console.log("testing here");
        this.emit(':tell', 'Hello there!');
    }, 
    'TrashPickUp': function () {
        var TrashPickUp="Trash Pick up on ";
        var Recycling="Recycling on ";
        var AlexaTell="For Address ";
        var output ="test";
        console.log("inside trash function");
        //Get data for Tash PickUp and Recycling
        https.get('https://data.boston.gov/api/action/datastore_search?resource_id=fee8ee07-b8b5-4ee5-b540-5162590ba5c1&q={"Address":"866 Huntington ave"}', (res) => {
            console.log('statusCode:', res.statusCode);
            console.log('headers:', res.headers);

            //Get Response and parse String for Alexa
            res.on('data', (d) => {
                output += d;
            });

            res.on('error', (e) => {
            console.error(e);
            });

            res.on('end', () => {
                var apiResponse = JSON.parse(output);
                output = AlexaTell + apiResponse["result"]["records"][0]["Address"] + 
                TrashPickUp + apiResponse["result"]["records"][0]["Trash"] +
                Recycling + apiResponse["result"]["records"][0]["Recycling"];
                console.log(output);
            });
        });
        console.log("outside about to send output");
        this.emit(':tell', output);                        
    }
};

exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.registerHandlers(handlers);
    alexa.execute();
};

我的休息/ js知识薄弱,我的alexa知识甚至更弱。我怀疑它与https.get中的异步调用有关,所以我移动了#34; this.emit"进入结束通话。然后我尝试使用" var self = this"在电话会议上方,因为我已阅读here,或许我的参考资料在获取通话中无法访问。

这些都没有解决我的问题。当我通过技能工具包进行测试时,它表示"响应无效",当我使用语音测试的输入进行测试并将其直接输入到lambda测试中时,它表示成功为null结果。 / p>

1 个答案:

答案 0 :(得分:-1)

您的问题与您在https响应解决之前退出该功能有关:

this.emit(':tell', output);

您需要将其移至

res.on('end', () => {
    console.log('In End: ', output)
    var apiResponse = JSON.parse(output);
    output = AlexaTell + apiResponse["result"]["records"][0]["Address"] + 
    TrashPickUp + apiResponse["result"]["records"][0]["Trash"] +
    Recycling + apiResponse["result"]["records"][0]["Recycling"];
    console.log(output);
    this.emit(':tell', output);  
});

您还需要更改行

var output ="test";

var output ="";

否则您的回复将在开始时进行“测试”。

这将解决您的问题,因为现在您在get调用的回调中而不是在其外部发出对Alexa的响应。 Lambdas不支持并发调用,因此一旦主线程结束,lambda将关闭。您应始终在回调中而不是异步地发出响应。