2017-08-10 64 views
0

我正在使用nodeJS代码使用请求模块进行其他调用。我也使用回调函数,但请求函数没有得到执行。AWS Lambda无法将REST调用到外部API

我的流程转到了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

当你调用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