从Lambda函数调用REST API

时间:2018-05-15 18:30:45

标签: alexa alexa-skills-kit alexa-skill

我正在尝试构建一种调用REST API来获取数据的技能。我正在使用HelloWorld示例并对其进行修改以满足我的需要。我正在使用Request节点(node.js)发出请求。

但是,对我来说,我无法让它发挥作用。我在日志中看到调用该函数并返回正确的结果,但发送给Alexa的响应是空的!!知道我错过了什么吗?

const HelloWorldIntentHandler = {
  canHandle(handlerInput) {
    console.log("HelloWorldIntentHandler 1: ");
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'HelloWorldIntent';
  },
  handle(handlerInput) {
    console.log("HelloWorldIntentHandler 2");
    var speechText = 'Hello World';

    Request.get(url, function(error, response, body) {
      console.log("I'm here")
      var data = JSON.parse(body)
      var result = data.records.totalNum
      if (result > 0) {
          speechText = "There are " + result + " matches";
      } else {
          speechText = "ERROR";
      }

      return handlerInput.responseBuilder
        .speak(speechText)
        .withSimpleCard('Hello World', speechText)
        .getResponse();
     });
  },
};

日志中的错误是

Error handled: speechOutput.trim is not a function

3 个答案:

答案 0 :(得分:2)

我能够使用Axios而不是Request来使用它。

const HelloWorldIntentHandler = {
  canHandle(handlerInput) {
    console.log("HelloWorldIntentHandler 1: ");
    return handlerInput.requestEnvelope.request.type === 'IntentRequest'
      && handlerInput.requestEnvelope.request.intent.name === 'HelloWorldIntent';
  },
  async handle(handlerInput) {
    console.log("HelloWorldIntentHandler 2");
    var speechText = 'default';

    try {
      const response = await Axios.get(url);
      var result = response.data.totalRecs;
      if (result > 0) {
          speechText = "There are " + result + " matches";
      } else {
          speechText = "ERROR";
      }
      console.log("text=" + speechText);
      return handlerInput.responseBuilder
        .speak(speechText)
         .withSimpleCard('Hello World', speechText)
         .getResponse();
    } catch (error) {
      console.log(error);
    }
  },
};

答案 1 :(得分:0)

对于它的价值,我遇到了同样的问题,并发现(困难的方式)我从api调用返回的响应包含 SSML格式不正确的文本 (在我的情况下,返回的字符串包含“&”)。

因此,我发现这个lib似乎不仅有帮助,而且如果您不能100%确定结果,通常可以使用。

请参阅:https://www.npmjs.com/package/ssml-builder

希望这对某人有帮助。

〜Rob

我想我也最好添加一个代码示例。这未经测试,但是使用上面提到的lib ^^^,您的代码可能看起来像这样。

const Speech = require( 'ssml-builder' );

const HelloWorldIntentHandler = {
    canHandle(handlerInput) {
        console.log("HelloWorldIntentHandler 1: ");
        return handlerInput.requestEnvelope.request.type === 'IntentRequest'
               && handlerInput.requestEnvelope.request.intent.name === 'HelloWorldIntent';
    },
    handle(handlerInput) {
        console.log("HelloWorldIntentHandler 2");
        let speechText = 'Hello World';

        Request.get(url, function(error, response, body) {
            console.log("I'm here");
            let data = JSON.parse(body);
            let result = data.records.totalNum;
            if (result > 0) {

                let speech = new Speech();
                speech.say(`There are ${result} matches`);
                speechText = speech.ssml(true);

            } else {
                speechText = "ERROR";
            }

            return handlerInput.responseBuilder
                               .speak(speechText)
                               .withSimpleCard('Hello World', speechText)
                               .getResponse();
        });
    },
};

答案 2 :(得分:-1)

将您的return放入if else语句中。

  Request.get(url, function(error, response, body) {
    console.log("I'm here")
    var data = JSON.parse(body)
    var result = data.records.totalNum

    if (result > 0) {
      speechText = "There are " + result + " matches";
      return handlerInput.responseBuilder
        .speak(speechText)
        .withSimpleCard('Hello World', speechText)
        .getResponse();
      });
    } else {
      speechText = "ERROR";
      return handlerInput.responseBuilder
         .speak(speechText)
         .withSimpleCard('Hello World', speechText)
         .getResponse();
      });
    }
  } 

这会强制你的处理程序在if else语句中返回结果。