2016-10-18 7 views
2

У меня есть модуль, который включает вызов запроса, который, похоже, не выполняется.Узел JS обратные вызовы с Alexa умение

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); 
    } 
} 

Я никогда не видел, чтобы тело google отображалось в моей консоли.log на консоли Lambda или где-либо еще. Я пробовал другие вызовы (например, сообщения API для API-интерфейса API приложений) и не вижу, чтобы они отображались на этом сервере.

Кажется, что процесс закрывается до завершения обратного вызова запроса.

В тесте Amazon Lambda «Я получаю действительный ответ. В тесте «Alexa» я возвращаю ответ «Recorded Test». И на Echo (через Alexa) я возвращаю ответ «Recorded Test» с устройства. Таким образом, умение, похоже, отлично работает. Это просто действие «запрос» (в данном случае, просто потянув 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

Кроме того, может быть, вызов терпит неудачу, и тело пусто. Я бы указал на явное сообщение журнала, чтобы убедиться, что он действительно не регистрируется. И несвязанный комментарий, но вы не должны устанавливать alexa.appId в свой APP_ID, вы должны убедиться, что они совпадают. – Tom

+0

Спасибо @Tom, я могу получить явное сообщение «Я получил здесь» внутри функции запроса, чтобы показать, если я делаю это через ошибку перед выполнением «this.emit». Поэтому, если функция TestIntent не завершена, обратный вызов имеет время для запуска и отчета. Поэтому мне нужно как-то заставить this.emit дождаться завершения обратного вызова. – probbins222

ответ

2

Ваш (оригинал) код не работает, потому что вы звоните this.emit(':tell', speechOutput);

только сразу после request("http://www.google.com",

The :tell функция будет вызывать лямбда обратный вызов и завершить выполнение функции лямбда ,

Вы нашли решение самостоятельно: дождаться завершения обратного вызова request и выпустить событие :tell в то время.

См Alexa-навыки-набор-СДК-для-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

Вы можете узнать больше о модели программирования Lambda в http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html