【问题标题】:alexa response is invalid/rest call troublealexa 响应无效/休息呼叫故障
【发布时间】:2017-09-26 02:43:17
【问题描述】:

这几天我一直试图弄清楚我的 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();
};

我的 rest/js 知识很薄弱,我的 alexa 知识更弱。我怀疑它与 https.get 中的异步调用有关,所以我将“this.emit”移到了 on end 调用中。然后我尝试在 get 调用上方使用“var self = this”,因为我读过 here 可能我的 this 引用在 get 调用中无法访问。

这些都没有解决我的问题。当我通过技能包对其进行测试时,它说“响应无效”,当我使用语音测试的输入对其进行测试并将其直接输入到 lambda 测试中时,它说成功,结果为空。

【问题讨论】:

  • 您遇到的错误是什么?请更新来自 CloudWatch 的错误问题。

标签: node.js rest aws-lambda alexa


【解决方案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 ="";

否则你的回复会以“test”开头。

这将解决您的问题,因为现在您在 get 调用的回调中而不是在它之外向 Alexa 发出响应。 Lambda 不支持并发调用,因此一旦主线程结束,lambda 就会关闭。您应该始终在回调中而不是异步发出响应。

【讨论】:

  • 原来是从一开始就拼错了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多