【问题标题】:Unable to get helper function to work in AWS lambda nodejs无法让辅助函数在 AWS lambda nodejs 中工作
【发布时间】:2020-08-10 21:48:53
【问题描述】:

我是 nodejs 和学习的新手,但不知道为什么我的辅助函数不起作用。 本质上,这是通常有效的示例 alexa lambda 函数的一部分。 如果我将 MQTTcode 留在 Intent 处理程序中,则 MQTT 操作有效,但我需要将其移出到代码主体中,以便我可以从其他代码函数调用 MQTT 操作。

这个 sn-p 中有几个“测试”函数无法工作,可能是因为我不欣赏将代码移出 Intent 函数的正确方法。

我也很不清楚处理程序..(实际上是多个处理程序)代码 sn-p 中有两个处理程序..它不会引起问题,但我希望有两个 lambda 触发器(问- sdk 和智能家居),每个都调用自己的处理程序 - 不确定这是否可能。


var APP_ID = "amzn1.ask.skill.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; // input the axela skill ID
var AWS = require('aws-sdk');
var Alexa = require("alexa-sdk");

AWS.config.region = "us-east-1";
var iotData = new AWS.IotData({endpoint: "xxxxxxxxxxx.iot.us-east-1.amazonaws.com"}); // input the AWS thing end point
var topic = "esp32/sub"; //input the topic that the device is subscribed to

// Handler for Generic Event handling accepts both SmartHomeand ask-sdk events
// But only works when the handler below is removed.
exports.handler = async function (event, context) {
  // Dump the request for logging - check the CloudWatch logs
    console.log("index.handler request  -----");
    console.log(JSON.stringify(event));
    if (context !== undefined) {
        console.log("index.handler context  -----");
        console.log(JSON.stringify(context));
    }
    switchon(); // test call of standalone MQTTfunction ( doesn't work)
};

// Remove this function and the Smarthome Test works.
// But is needed for the ask-sdk events ( Smarthome events fail )
exports.handler = function(event, context, callback) {
    var alexa = Alexa.handler(event, context);
    alexa.appId = APP_ID;
    alexa.registerHandlers(handlers);
    alexa.execute();
    console.log("index.handler comment  -----");   
};


//*********************************
//   Helper code examples to functionalise the MQTT switch on
//   NONE OF THESE WORK WHEN CALLED

function switchon3(){

          var dataObj = {
          topic: topic,
          payload: "on",
          qos:0
      };
    iotData.publish(dataObj, function (err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
}

function switchon (error, data){
      var params = {
          topic: topic,
          payload: "on",
          qos:0
      };

      iotData.publish(params, (error, data)=>{
          if (!error){this.emit(':tell', 'Robert, well done its Switched On');

          }else{this.emit(':tell', 'Oh dear MQTT returned a switch on error')}
        });

}

// End of helper examples
//*********************************

//********* THE PROPER CODE ************************ 

var handlers = {


    'LaunchRequest': function () {
     this.emit(':tell', 'Hello. Skill four here. How may I help you?');
     },

    'SwitchOnIntent': function () {

//    None of the example function calls work here       
//        switchon3();
//        this.emit(':tell', 'Test Switch On');   // needs this line to work     


 // The following original example code DOES work      
      var params = {
          topic: topic,
          payload: "on",
          qos:0
      };
      iotData.publish(params, (error, data)=>{
          if (!error){this.emit(':tell', 'Robert, well done its Switched On');

          }else{this.emit(':tell', 'Oh dear MQTT returned a switch on error')}
        });

    },

已编辑...

不,Tommy,这不是太基本,感谢您的帮助。我实际上是在尝试让 lambda 接受来自两个 AWS 触发器的输入。 1.自定义技能的ASK-API 2. 智能家居触发器。 我不确定这两个触发器是否需要单独的处理函数,或者,如果我怀疑,使用 smarthome 触发器会使使用以某种方式调用注册 Intent 函数的 ask-api 方法无效, 到达的 json 的格式明显不同于两种触发器类型,我很欣赏可以在 lambda 中手动执行所有 alexa 自定义技能解析。 那么我的问题是..如果从自定义技能开始,如果我添加一个 smarthome 触发器,那么使用 ask-api 注册所有函数调用将变得无效,因为处理 ask-api 事件的一个处理程序也不能处理智能家居指令。

在整理之后,试图“带出” MQTT 调用,该调用在最初编码的 Intent 函数中工作,但如果我尝试将它们放入单独的函数调用中,则会失败。 忍耐一下……我知道我想做什么……只是还不太懂这门语言。

【问题讨论】:

    标签: node.js aws-lambda alexa


    【解决方案1】:

    我认为你在这里没有掌握的是你实际上覆盖了同一个变量。

    exports 是一个对象(变量),它可以有多个属性。如果这太基本了,请原谅我,但属性基本上是附加到另一个变量的变量。

    在您的代码中,您首先将此属性的值分配给一个函数。

    exports.handler = async function (event, context) {
      // Dump the request for logging - check the CloudWatch logs
        console.log("index.handler request  -----");
        console.log(JSON.stringify(event));
        if (context !== undefined) {
            console.log("index.handler context  -----");
            console.log(JSON.stringify(context));
        }
        switchon(); // test call of standalone MQTTfunction ( doesn't work)
    };
    

    因此,如果您随后运行exports.handler(),它将运行该功能。但是,您随后重新分配此变量几行。

    所以现在是以下内容:

    exports.handler = function(event, context, callback) {
        var alexa = Alexa.handler(event, context);
        alexa.appId = APP_ID;
        alexa.registerHandlers(handlers);
        alexa.execute();
        console.log("index.handler comment  -----");   
    };
    

    您正在用第二个函数替​​换第一个函数,这就是为什么注释掉 exports.handler 的第二个赋值会导致第一位工作。我不是 100% 清楚你在问什么,但是如果可以的话,你要么需要结合两个函数的内容(或者有一个处理程序来检查事件并调用单独的函数),要么将它们移动到单独的 lambda .

    例如:

    exports.handler = function(event,context,callback) {
      if(event.EventType === "YourGenericEvent") { // replace YourGenericEvent with whatever the eventName is for the first function
          genericEvent(event,context)
      } else if(event.EventType === "SecondEvent") { // again replace "SecondEvent" with whatever the event is for your second function
         secondEvent(event,context,callback)
      }
    }
    
    function genericEvent (event, context) {
      // Dump the request for logging - check the CloudWatch logs
        console.log("index.handler request  -----");
        console.log(JSON.stringify(event));
        if (context !== undefined) {
            console.log("index.handler context  -----");
            console.log(JSON.stringify(context));
        }
        switchon(); // test call of standalone MQTTfunction ( doesn't work)
    };
    
    function secondEvent(event,context,callback) {
        var alexa = Alexa.handler(event, context);
        alexa.appId = APP_ID;
        alexa.registerHandlers(handlers);
        alexa.execute();
        console.log("index.handler comment  -----");   
    }
    

    您的console.log(event) 语句应该有望让您知道EventType 属性对于IF 语句的值应该是什么。

    您可以在此处查看与 Python 相关的另一篇文章

    How to have more than one handler in AWS Lambda Function?

    【讨论】:

    • 汤米。编辑原始问题并提供更多详细信息。
    猜你喜欢
    • 2019-07-20
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2012-10-24
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    相关资源
    最近更新 更多