2

Я все время сталкиваюсь с проблемой со следующим кодом с Amazon Lambda и набором навыков alexa. Я потратил на это бесчисленные часы и не могу заставить его работать. Я продолжаю возвращать это сообщение и не могу понять, почему HTTP get не работает. "Пожалуйста, повторите попытку позже". Он даже не печатает сообщения консоли.Amazon AWS Lambda Alexa HTTP Получить вопрос

var Alexa = require('alexa-sdk'); 
var http = require('http'); 
var APP_ID = "omitted";  
var SKILL_NAME = 'omitted'; 

var options = { 
    host: 'api.forismatic.com', 
    path: '/api/1.0/?method=getQuote&lang=en&format=text', 
    method: 'GET' 
}; 

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

var handlers = { 
'LaunchRequest': function() { 
    this.emit('Inspiration'); 
}, 
'IntentRequest': function() { 
    this.emit('Inspiration'); 
}, 
'InspirationIntent': function() { 
    this.emit('Inspiration'); 
}, 
'Inspiration': function() { 
    var speechOutput = ''; 
    var text = ''; 
    http.get(options, function(res) { 
     console.error("Got response: " + res.statusCode); 
     res.on("data", function(chunk) { 
     console.error("BODY: " + chunk); 
     text = chunk; 
    }); 
    }).on('error', function(e) { 
     text = 'error' + e.message; 
     console.error("Got error: " + e.message); 
}); 
    if(text == ''){ 
    speechOutput = "Please try again later"; 
    } 
    else{speechOutput = text;} 
    this.emit(':tellWithCard', speechOutput, SKILL_NAME, text); 
}, 
'AMAZON.HelpIntent': function() { 
    var speechOutput = "You can ask Inspirational Quote for some advice."; 
    var reprompt = "What would you like me to do?"; 
    this.emit(':ask', speechOutput, reprompt); 
}, 
'AMAZON.CancelIntent': function() { 
    this.emit(':tell', 'Goodbye!'); 
}, 
'AMAZON.StopIntent': function() { 
    this.emit(':tell', 'Goodbye!'); 
}, 
'Unhandled': function() { 
    this.emit('AMAZON.HelpIntent'); 
} 
}; 

ответ

6

Поскольку Java скрипт асинхронно, этот код:

if(text == ''){ 
speechOutput = "Please try again later"; 
} 
else{speechOutput = text;} 
this.emit(':tellWithCard', speechOutput, SKILL_NAME, text); 

работает до крикнуть к API получает ответ.

К сожалению, вы не можете просто переместить вышеуказанный код внутри блока http.get, так как «this» в «this.emit» больше не будет работать, и вы получите неопределенный ответ, который будет отправлен обратно умение Алекса.

Я думаю, что самым простым решением было бы вывести вызов http в отдельную функцию. При вызове этой функции вам придется использовать обратный вызов, чтобы избежать такой же проблемы, когда лямбда не дождалась ответа от HTTP-вызова, прежде чем переходить к следующей строке кода. Поэтому передайте функцию с вызовом функции и отправьте ответ оттуда. NB - для этого вам нужно назначить переменную значению «this» вне вызова функции и использовать эту переменную вместо «this» внутри вызова функции.

Пример ниже:

var Alexa = require('alexa-sdk'); 
var http = require('http'); 
var APP_ID = "omitted";  
var SKILL_NAME = 'omitted'; 

var options = { 
    host: 'api.forismatic.com', 
    path: '/api/1.0/?method=getQuote&lang=en&format=text', 
    method: 'GET' 
}; 

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

var handlers = { 
    'LaunchRequest': function() { 
     this.emit('Inspiration'); 
    }, 
    'IntentRequest': function() { 
     this.emit('Inspiration'); 
    }, 
    'InspirationIntent': function() { 
     this.emit('Inspiration'); 
    }, 
    'Inspiration': function() { 
     var speechOutput = ''; 
     var text = ''; 
     var self = this; 
     getQuote(options, function (quote){ 
      if(quote == ''){ 
      speechOutput = "Please try again later"; 
      } 
      else{speechOutput = quote;} 
      self.emit(':tellWithCard', speechOutput, SKILL_NAME, text); 
     } 
    )}, 
    'AMAZON.HelpIntent': function() { 
     var speechOutput = "You can ask Inspirational Quote for some advice."; 
     var reprompt = "What would you like me to do?"; 
     res(this.emit(':ask', speechOutput, reprompt)); 
    }, 
    'AMAZON.CancelIntent': function() { 
     this.emit(':tell', 'Goodbye!'); 
    }, 
    'AMAZON.StopIntent': function() { 
     this.emit(':tell', 'Goodbye!'); 
    }, 
    'Unhandled': function() { 
     this.emit('AMAZON.HelpIntent'); 
    } 
}; 

function getQuote(options, callback){ 
    http.get(options, function(res) { 
     console.error("Got response: " + res.statusCode); 
     res.on("data", function(chunk) { 
     console.error("BODY: " + chunk); 
     text = '' + chunk; 
     return callback(text); 
    }); 
    }).on('error', function(e) { 
     text = 'error' + e.message; 
     console.error("Got error: " + e.message); 
}); 
} 
+0

Благодаря. Это сделало это – logepoge1