2017-03-09 90 views
2

在Node.js Lambda函数和Alexa之间对API进行REST调用时出现问题。我正在使用request库来使用帐户关联技能拨打电话。我只为这个意图设置了一个样本话语,模拟器看到这个很好。Node.js Lambda函数从REST调用返回“Alexa响应无效”

此外,cloudwatch日志显示来自api端点的200响应代码以及API中从console.logs到CW的任何返回数据。

'use strict'; 
var http = require('http'); 
var request = require('request'); 
var Alexa = require('alexa-sdk'); 
var APP_ID = "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX"; 

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

var handlers = { 
    'LaunchRequest': function() { 
     this.emit(':tell', 'Hi!'); 
    }, 

    'ApiWelcomeIntent': function() { 
     request('https://some.web/api', function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
      // from within the callback, write data to response, essentially returning it. 
       var speechOutput = JSON.stringify(body); 
       console.log(body + " :Raw output?"); 
       console.log(speechOutput + ' :JSON stringified'); 
       console.log(response.statusCode); 
       this.emit(':tell', speechOutput); 
      } else { 
       console.log(error + ' : ' + response.statusCode); 
       this.emit(':tell', 'There was an error'); 
      } 
     }); 
    }, 

    'AMAZON.HelpIntent': function() {} //.........And other built in intents. 

    } 
}; 

我在猜测它与某些我要求Alexa“发出/说出”的speechOutput格式有关吗?

回答

4

不,它与speechOutput的格式无关。问题是执行request方法的回调时,对this的引用丢失。为了解决这个问题,保持对this参考调用request之前(例如分配this一个叫self变量):

'use strict'; 
var http = require('http'); 
var request = require('request'); 
var Alexa = require('alexa-sdk'); 
var APP_ID = "amzn1.ask.skill.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX"; 

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

var handlers = { 
    'LaunchRequest': function() { 
     this.emit(':tell', 'Hi!'); 
    }, 

    'ApiWelcomeIntent': function() { 
     self = this 

     request('https://some.web/api', function (error, response, body) { 
      if (!error && response.statusCode == 200) { 
      // from within the callback, write data to response, essentially returning it. 
       var speechOutput = JSON.stringify(body); 
       console.log(body + " :Raw output?"); 
       console.log(speechOutput + ' :JSON stringified'); 
       console.log(response.statusCode); 
       self.emit(':tell', speechOutput); // USE SELF HERE 
      } else { 
       console.log(error + ' : ' + response.statusCode); 
       self.emit(':tell', 'There was an error'); // AND HERE AS WELL 
      } 
     }); 
    }, 

    'AMAZON.HelpIntent': function() {} //.........And other built in intents. 

    } 
}; 
+0

嘿@renansdias你的答案听起来很正确的,但使用自后我仍然面临的问题。你可以检查我的代码以及在https://stackoverflow.com/questions/45613412/aws-lambda-not-able-to-make-rest-call-to-external-api – devutkarsh