Я новичок в 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. 1. ASK-API от пользовательских навыков 2. Триггер Smarthome. Я не уверен, нужны ли этим двум триггерам отдельные функции-обработчики, или, если, как я подозреваю, использование триггера smarthome отменяет использование методов ask-api, которые каким-то образом вызывают зарегистрированные функции Intent, полученный json явно отформатирован иначе, чем оба типа триггеров, и я понимаю, что можно выполнять синтаксический анализ пользовательских навыков alexa вручную в лямбда-выражении. Тогда у меня вопрос … если вы начинаете с пользовательского навыка, регистрация всех вызовов функций с помощью ask-api становится недействительной, если я затем добавляю триггер smarthome, потому что один обработчик, который имел дело с событием ask-api, не может также иметь дело с директива smarthome.
После того, как разобрались с этим, он пытается «активировать» вызов MQTT, который работает в функциях Intent, как это было изначально закодировано, но терпит неудачу, если я попытаюсь поместить их в отдельные вызовы функций. Потерпи меня … Я знаю, что хочу делать … просто еще совсем не знаю этот язык.
Я думаю, что вы здесь не понимаете, что вы на самом деле перезаписываете одну и ту же переменную.
exports— это объект (переменная), который может иметь несколько свойств. Простите меня, если это слишком просто, но свойство — это в основном переменная, прикрепленная к другой переменной.В вашем коде вы сначала присваиваете значение этого свойства функции.
поэтому, если вы затем запустите
exports.handler(), она запустит эту функцию. Однако затем вы переназначаете эту переменную на несколько строк вниз.Итак, теперь это ниже:
Вы заменяете первую функцию второй, поэтому комментирование второго присваивания
exports.handlerзаставляет работать первый бит. Я не на 100% понимаю, о чем вы спрашиваете, но вам нужно либо объединить содержимое обеих функций, если вы можете (или иметь один обработчик, который проверяет событие и вызывает отдельную функцию), либо переместить их в отдельные лямбды. .Например:
Ваши операторы
console.log(event)должны, надеюсь, дать вам представление о том, каким должно быть значение свойстваEventTypeдля операторовIF.Вы можете увидеть еще один пост, связанный с Python здесь
Как иметь более одного обработчика в AWS Lambda Функция?
Томми. Отредактировал исходный вопрос с более подробной информацией. — person Robbo; 28.04.2020