AWS Lambda Nodejs async.waterfall не выполняет функцию MQTT

Я пытаюсь использовать async.waterfall в обработчике экспорта и последовательно вызывать функции. Одна из функций связана с публикацией сообщений MQTT. Пока функции вызываются, но когда вызывается функция MQTT, она просто останавливается и не вызывает требование («MQTT»).

exports.handler = function(event, context) {
        var async = require('async');

        async.waterfall([
            function(callback) {
                retrieveEmailId(apiAccessToken,callback)
            },
            function(emailId, callback) {
                retrieveDeviceDetails(callback)
            },
            function(deviceDetail, callback) {
                publishMsg(callback)
            }

        ], function(err, result) {
            if (err) console.log('Error :: \n' + err);
        });
    }

    function retrieveEmailId(accessToken, callback) {
        var getEmailFromAlexaProfileObj = require('./GetEmailFromAlexaProfile');
        getEmailFromAlexaProfileObj.doIt(accessToken, function(returnVal) {
            console.log(returnVal);
            callback(null, returnVal)
        });
    }

    function retrieveDeviceDetails(callback) {
        var getDevcieDetailsObj = require('./GetDevcieDetails');
        getDeviceDetailsObj.doIt(null, function(returnVal) {
            console.log(returnVal);
            callback(null, returnVal)
        });
    }

    function publishMsg() {
        var mqtt = require('mqtt');

        var options = {
            clientId: "xxx",
            username: "yyy",
            password: "zzz",
            clean: true
        };

        var client = mqtt.connect("mqtt://xxx.com", options)

        client.on("connect", function () {              
            client.publish('xxx/yyy/L1', "1", options);             
            client.end();
        });         
    }

person sk2412    schedule 20.12.2018    source источник
comment
Пожалуйста, прочитайте При каких обстоятельствах я могу добавить «срочно» или другие подобные фразы к моему вопросу, чтобы получить более быстрые ответы? - Подводя итог, можно сказать, что это не идеальный способ обращения к волонтерам и, вероятно, контрпродуктивно для получения ответов. Пожалуйста, воздержитесь от добавления этого к своим вопросам.   -  person halfer    schedule 21.12.2018


Ответы (2)


Вы пытались запустить код локально, используя «лямбда-локальный»? Работает ли эта последовательность вызовов вместе с последней, которая является MQTT? Что вы заметили, когда вызывали «require('mqtt')» в лямбде?

person user2797835    schedule 21.12.2018
comment
Код отлично работает при локальном запуске с использованием lambda-local с той же последовательностью функций. Когда он вызывается с AWS, хотя код вызывает функцию MQTT, но как только он достигает require('MQTT'), он просто завершается без ошибок в журналах cloudwatch. Таким образом, это не дает никакой подсказки, что может быть причиной. - person sk2412; 21.12.2018
comment
вы удалили context.suceeed()? Это иногда приводит к тому, что управление исчезает к тому времени, когда другая функция выполняется и завершается. - person user2797835; 21.12.2018
comment
Да, даже после удаления context.succeed() вызов MQTT не выполняется. Ждем ваших профессиональных советов... - person sk2412; 21.12.2018
comment
какая версия npm mqtt использовалась? последний — [email protected]. - person user2797835; 21.12.2018
comment
Да использовал последнюю версию [email protected] - person sk2412; 21.12.2018

Проблема была решена, если переменная require была выполнена до exports.handler.

Например....

var AWS = require('aws-sdk');
var async = require('async');

exports.handler = функция (событие, контекст) {

.... }

person sk2412    schedule 23.12.2018