У меня есть лямбда-функция для навыка Alexa, которая написана на Nodejs.Это делает HTTP-вызов к сервису и возвращает результат в Alexa Skill.Когда вызывается навык, вызывается лямбда и выполняется HTTP-вызов.Однако перед возвратом ответа HTTP возвращается лямбда, поэтому умение не получает ответа.
Ниже представлена моя лямбда-функция
var Alexa = require('ask-sdk');
var http = require('http');
var SKILL_NAME = 'Some Facts';
var GetNewFactHandler = {
canHandle(handlerInput) {
var request = handlerInput.requestEnvelope.request;
return request.type === 'LaunchRequest'
|| (request.type === 'IntentRequest'
&& request.intent.name === 'GetNewFactIntent');
},
handle(handlerInput) {
getTop("", (data)=>{
let speechOutput = "The result is " + data;
console.log("resp from lambda ", speechOutput)
var respSpeak = handlerInput.responseBuilder
.speak(speechOutput)
.withSimpleCard(SKILL_NAME, data)
.getResponse();
console.log("respSpeak ", respSpeak);
return respSpeak;
});
},
};
function getTop(query, callback) {
var options = {
host: 'somehost',
port: '8100',
path: '/top',
method: 'GET',
};
var req = http.request(options, res => {
res.setEncoding('utf8');
var responseString = "";
res.on('data', chunk => {
responseString = responseString + chunk;
});
res.on('end', () => {
console.log("********",JSON.parse(responseString).Name);
let respStr = JSON.parse(responseString).Name;
callback(respStr);
});
});
req.end();
}
В журналах лямбды я вижулоги в getTop ().Но ответ лямбды возвращается до получения ответа HTTP-вызова.Я думал, что построение ответа в обратном вызове гарантирует, что ответ будет возвращен только после завершения HTTP-вызова.Но, похоже, это не так.Как это можно исправить?Любая помощь приветствуется.