我一直试图弄清楚我的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>
答案 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将关闭。您应始终在回调中而不是异步地发出响应。