AWS Lambda Node.js async.waterfall无法执行MQTT函数

时间:2018-12-20 16:48:14

标签: asynchronous aws-lambda waterfall

我正在尝试在导出处理程序中使用async.waterfall,并依次调用函数。功能之一与MQTT消息发布有关。在调用函数时,但是在调用MQTT函数时,它只是停止而不调用require('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();
        });         
    }

2 个答案:

答案 0 :(得分:0)

您是否尝试过使用“ lambda-local”在本地运行代码?那一连串的呼叫能否与最后一个MQTT一起使用?在lambda中调用“ require('mqtt')”时,您注意到了什么?

答案 1 :(得分:0)

如果require变量在export.handler之前完成,问题就解决了。

例如。...

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

exports.handler =函数(事件,上下文){

... }