2

Amazon Lambdaとalexaスキルキットで次のコードの問題が引き続き発生します。私はこれに数え切れないほどの時間を費やしており、それを働かせることはできません。私はこのメッセージが返ってきているので、なぜhttpが失敗したのか理解できません。 "後でやり直してください"。コンソールメッセージを印刷することさえできません。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スクリプトが非同期であるため、このコード:APIを呼び出すには応答を取得する前に

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

が実行されています。

残念ながら、http.getブロック内に上記のコードを移動することはできません。 'this.emit'の 'this'が機能しなくなり、未定義の応答が返されますアレクサスキル。

私は最善の解決策は、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

関連する問題