Невозможно заставить вспомогательную функцию работать в AWS lambda nodejs

Я новичок в nodejs и учусь, но не могу понять, почему моя вспомогательная функция не работает. По сути, это часть примера лямбда-функции alexa, которая обычно работает. Операция MQTT работает, если я оставляю код MQTT в обработчике намерений, но мне нужно переместить его в основную часть кода, чтобы я мог вызывать операцию MQTT из других функций кода.

В этом фрагменте есть несколько «тестовых» функций, которые не работают, вероятно, потому, что мне не нравится правильный способ переместить код из функции Intent.

Я также не совсем понимаю обработчики … (на самом деле несколько обработчиков) Во фрагменте кода есть два обработчика … это не вызывает проблем, но я надеялся получить два лямбда-триггера (ask-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')}
        });

    },

Отредактировано …

См. также:  Как создать очередь AWS SQS FIFO в Rails?

Нет, Томми, это не так уж и просто, спасибо за помощь. На самом деле я пытаюсь заставить лямбда принимать входные данные от двух триггеров AWS. 1. ASK-API от пользовательских навыков 2. Триггер Smarthome. Я не уверен, нужны ли этим двум триггерам отдельные функции-обработчики, или, если, как я подозреваю, использование триггера smarthome отменяет использование методов ask-api, которые каким-то образом вызывают зарегистрированные функции Intent, полученный json явно отформатирован иначе, чем оба типа триггеров, и я понимаю, что можно выполнять синтаксический анализ пользовательских навыков alexa вручную в лямбда-выражении. Тогда у меня вопрос … если вы начинаете с пользовательского навыка, регистрация всех вызовов функций с помощью ask-api становится недействительной, если я затем добавляю триггер smarthome, потому что один обработчик, который имел дело с событием ask-api, не может также иметь дело с директива smarthome.

После того, как разобрались с этим, он пытается «активировать» вызов MQTT, который работает в функциях Intent, как это было изначально закодировано, но терпит неудачу, если я попытаюсь поместить их в отдельные вызовы функций. Потерпи меня … Я знаю, что хочу делать … просто еще совсем не знаю этот язык.

Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Robbo

    Я думаю, что вы здесь не понимаете, что вы на самом деле перезаписываете одну и ту же переменную.

    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% понимаю, о чем вы спрашиваете, но вам нужно либо объединить содержимое обеих функций, если вы можете (или иметь один обработчик, который проверяет событие и вызывает отдельную функцию), либо переместить их в отдельные лямбды. .

    Например:

    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 здесь

    Как иметь более одного обработчика в AWS Lambda Функция?

    Томми. Отредактировал исходный вопрос с более подробной информацией. person Robbo; 28.04.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: