我使用nodeJS代码使用请求模块进行休息调用。我也使用了回调函数,但请求函数没有被执行。
我的流程转到searchTSTData函数,但请求方法没有被执行。
从回调函数我只得到responseString ='然而,要使查询休息'我在searchTSTData函数中初始化了。它没有根据API返回的响应进行更新,该响应应该是错误或成功响应字符串。
我已将模块包含在zip中,因为lambda没有抛出错误并通过测试。 此外,我确信请求模块在Cloudwatch日志中不起作用我没有看到我在请求中写的任何console.logs。
请说明我哪里出错了。我是NodeJS的新手。
这是代码 -
'use strict';
const request = require('request');
const Alexa = require('alexa-sdk');
const APP_ID = 'amzn1.ask.skill.80a49cf5-254c-123a-a456-98745asd21456';
const languageStrings = {
'en': {
translation: {
TST: [
'A year on Mercury is just 88 days long.',
],
SKILL_NAME: 'TEST',
GET_TST_MESSAGE: "Here's your TST: You searched for ",
HELP_MESSAGE: 'You can say get me a TST, or, you can say exit... What can I help you with?',
HELP_REPROMPT: 'What can I help you with?',
STOP_MESSAGE: 'Goodbye!',
},
},
};
const handlers = {
'LaunchRequest': function () {
this.emit('GetTST');
},
'GetNewTSTIntent': function () {
this.emit('GetTST');
},
'GetTST': function () {
// Get a random space fact from the space facts list
// Use this.t() to get corresponding language data
const inputValue = this.event.request.intent.slots.Search.value;
var finalResponse = "Some error occurred in code. Please try again later.";
console.log('Input recieved as '+inputValue);
searchTSTData(inputValue, function (response){
console.log('trying to call');
finalResponse = response;
});
console.log("after function call");
// Create speech output
const speechOutput = this.t('GET_TST_MESSAGE') + inputValue+". Here are the results " +finalResponse;
this.emit(':tellWithCard', speechOutput, this.t('SKILL_NAME'), speechOutput);
},
'AMAZON.HelpIntent': function () {
const speechOutput = this.t('HELP_MESSAGE');
const reprompt = this.t('HELP_MESSAGE');
this.emit(':ask', speechOutput, reprompt);
},
'AMAZON.CancelIntent': function () {
this.emit(':tell', this.t('STOP_MESSAGE'));
},
'AMAZON.StopIntent': function () {
this.emit(':tell', this.t('STOP_MESSAGE'));
},
};
exports.handler = function (event, context) {
const alexa = Alexa.handler(event, context);
alexa.APP_ID = APP_ID;
// To enable string internationalization (i18n) features, set a resources object.
alexa.resources = languageStrings;
alexa.registerHandlers(handlers);
alexa.execute();
};
function searchTSTData(searchString,callback){
var responseString = 'Yet to make query rest';
request({
url: 'https://api.google.com/getresultsInJson',
method: 'GET'
}, function (error, response, body) {
if (error) {
responseString = 'Error received from rest api. Please try again after some time.';
} else if(response.statusCode===200){
responseString = 'Sucess Success';
}else{
responseString = 'Nothing is working';
}
});
callback(responseString);
}
答案 0 :(得分:3)
是你在VPC中的lambda方法吗?检查此http://docs.aws.amazon.com/lambda/latest/dg/vpc.html您需要提供外部访问权限
答案 1 :(得分:0)
当您致电this.emit()
时,Alexa-SDK会结束您的lambda事件循环。
在您的示例中,您正在调用request()
,它正在异步工作。在调用request()
(通过searchTSTData()
)后,您立即发出this.emit()
,这会结束事件循环并使响应无法处理。
为了处理您的回复,您希望保持对this.emit()
的调用:
const handlers = {
'GetTST': function () {
searchTSTData(inputValue, (response) => {
const speechOutput = response;
this.emit(':tell', speechOutput);
});
}
};
在此处阅读有关nodejs下的lambda函数的编程模型:http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html