2016-10-18 3 views
2

요청 호출을 포함하는 모듈이 있는데, 실행되지 않는 것으로 보입니다.노드 Alexa 스킬을 사용하는 JS 콜백

var request = require('request'); 
var Alexa = require('alexa-sdk'); 
var APP_ID = <my alexa app ID>; 

var self = module.exports = { 
    handler : function (event, context, callback) { 
      var alexa = Alexa.handler(event, context); 
      alexa.appId = APP_ID; 
      alexa.registerHandlers(self); 
      alexa.execute(); 
    }, 
    "TestIntent": function() { 
     var speechOutput = "Recorded Test"; 
     request("http://www.google.com", 
      function(error, response,body) 
      { 
       return console.log(body); 
      } 
     ); 
     this.emit(':tell', speechOutput); 
    } 
} 

나는 구글의 몸이 다른 곳 람다 콘솔이나 내 CONSOLE.LOG에 표시 볼 수 없습니다. 다른 호출 (예 : 내 응용 프로그램 서버 API에 대한 API 게시물)을 시도했지만 해당 서버에서도 해당 호출이 표시되지 않습니다.

요청 콜백이 완료되기 전에 프로세스가 종료 된 것처럼 보입니다.

Amazon Lambda "테스터"에서 나는 유효한 응답을 얻습니다. Alexa "테스터"에서는 "기록 테스트"의 응답을 받았습니다. 그리고 에코 (알렉사 경유)에서, 나는 장치로부터 "기록 된 테스트"응답을 되 찾는다. 그래서 스킬이 훌륭하게 작동하는 것 같습니다. 실패한 '요청'액션 (이 경우 단순히 google.com을 가져 오는 행위) 일뿐입니다.

감사합니다.

업데이트 : 업데이트를 완료 할 수 있었지만 아마도 가장 깨끗한 방법은 아닐 수 있습니다.

var request = require('request'); 
var Alexa = require('alexa-sdk'); 
var APP_ID = <my alexa app ID>; 

var self = module.exports = { 
    handler : function (event, context, callback) { 
      var alexa = Alexa.handler(event, context); 
      alexa.appId = APP_ID; 
      alexa.registerHandlers(self); 
      alexa.execute(); 
    }, 
    "TestIntent": function() { 
     var that = this; 
     var speechOutput = "Recorded Test"; 
     request("http://www.google.com", 
      function(error, response,body) 
      { 
       console.log(body); 
       that.emit(':tell', speechOutput); 
       return; 
      } 
     ); 
    } 
} 
+0

에서 람다 프로그래밍 모델에 대해 자세히 알아볼 수 있습니다에서 당신은 현재 버전을 사용하고 있습니까 람다 (4.3)의? 콜백을 호출 할 때 이전 버전이 프로세스를 중단시킬 수 있는지 궁금합니다. 내가 사용하는 테스트 하니스 (node-lamdba)가 이것을 수행한다는 것을 알았습니다.이 동작은 이전 람다를 위해 설계되었고 업데이트되지 않았기 때문에 생각합니다. – Tom

+0

또한 호출이 실패하고 본문이 비어있을 수 있습니다. 나는 정말로 기록 된 것이 아닌지 확실하게하기 위해 거기에 명시적인 로그 메시지를 붙일 것이다. 그리고 관련없는 주석,하지만 당신은 APP_ID에 alexa.appId를 설정하지 않아도, 당신은 그들이 일치하는지 확인하기로되어 있습니다. – Tom

+0

Thanks @Tom, "this.emit"을 실행하기 전에 버그를 통해 확인한 경우 요청 기능 내에 명시 적 "I got here"라는 메시지가 표시 될 수 있습니다. 따라서 TestIntent 함수가 완료되지 않으면 콜백은 실행하고보고 할 시간이 있습니다. 그래서 나는 어떻게 든 콜백이 끝날 때까지 기다리는 this.emit을 얻을 필요가있다. – probbins222

답변

2
당신은 람다 콜백을 호출하고 람다 함수의 실행을 종료합니다 바로 request("http://www.google.com",

:tell 함수 뒤에 this.emit(':tell', speechOutput);

를 호출하기 때문에 귀하의 (원본) 코드가 작동하지 않는

.

직접 해결책을 찾았습니다. request 콜백이 실행될 때까지 기다렸다가 그 시점에 :tell 이벤트를 발행하십시오.

참조 알렉사 - 기술 - 키트 SDK를 위해 nodejs 코드
https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/master/lib/response.js#L6

https://github.com/alexa/alexa-skills-kit-sdk-for-nodejs/blob/master/lib/response.js#L101

당신은 http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html