【问题标题】:async.parallel not executing last cllback function when using with lambda functions与 lambda 函数一起使用时,async.parallel 不执行最后一个 cllback 函数
【发布时间】:2016-01-08 02:14:14
【问题描述】:

我正在节点 js 中编写一个 lambda 函数。我有基于输入事件的主 js 文件(index.js)调用第二个 js 文件(loader.ls)中的方法。 问题是在 loader.js 中方法执行完成后, index.js 中的回调没有被执行。下面是代码

index.js 中的代码

var yates = require("./yatesLoader");

module.exports.handler = function(event, context) {
    if(event.app === undefined || event.data === undefined){
        context.fail("invalid request");
    }
    if(event.app === 'YatesDataLoader'){
        var result = yates.sendNotification(event.data, function(err, resp){
            if(err){
                console.log("Error : " + JSON.stringify(err));
                context.done(null, "error occured");
            }
            console.log("response : " + JSON.stringify(resp));
            context.done(null, resp);  // SUCCESS with message
        });
    }    
};

loader.js 中的代码

var config = require("./config");
var optDynamo = config.DynamoDb;
var optSlack = config.Slack;

var async = require("async");
var req = require("request");
var AWS = require("aws-sdk");

AWS.config.update({
  region: optDynamo.region
});

var DynamoDb = new AWS.DynamoDB();

var sendNotification = function(data, callback){
    async.parallel([
        sendSlackNotification.bind(null, data, cb),
        saveDataToDynamoDb.bind(null, data, cb)     
    ], function(err, results){
        if (err) {
            console.error("Error JSON:", JSON.stringify(err, null, 2));
            return callback(err, null);
        } else {
            console.log("Success:", JSON.stringify(results, null, 2));
            return callback(null, results);
        }
    });
};

var cb = function(err, resp){
    if(err){
        console.log("Error");
    }else {
        console.log("success");
    }   
};

var saveDataToDynamoDb = function(data, cb){
    var params = {
        "TableName" : optDynamo.table,
        "Item" : {
            "TimeStamp" : {"S" : new Date().toString() },
            "ErrorMessage" : {"S" : data }
        }
    };

    console.log("adding new data to DynamoDb");
    DynamoDb.putItem(params, function(err, data){
        if (err) {
            console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2));
            return cb(err, null);
        } else {
            console.log("Added item:", JSON.stringify(data, null, 2));
            return cb(null, data);
        }
    });
};

var sendSlackNotification = function(data, cb){
    var options = {
        method : 'post',
        body : {"text" : data},
        json : true,
        url :  optSlack.url
    };
    console.log("sending msg to slack");
    req(options, function(err, resp){
        if(err){            
            console.error("Unable to send message to Slack. Error JSON:", JSON.stringify(err, null, 2));
            return cb(err, null);
        } else {
            console.log("Message sent to Slack:", JSON.stringify(resp, null, 2));
            return cb(null, resp);
        }
    })
};

module.exports = {sendNotification : sendNotification};

有人可以帮助了解这里出了什么问题。

【问题讨论】:

  • 可以分享一下日志输出吗?
  • 没有错误..问题是在 index.js 中调用 yates.sendNotification 时定义的调用没有被执行。
  • 您是否尝试过 console.logging event 以确保您获得了预期的数据?我认为它不会给您带来问题,但您应该返回任何被视为“最终”的语句,例如 return context.done(),否则它将继续运行它之后的语句。
  • @Ryan - 我在event 中获取数据。这里的问题是,async.parallel 中的函数执行后,最终的回调没有被执行。

标签: node.js amazon-web-services callback aws-lambda


【解决方案1】:

这是因为您使用.bind() 的方式。它正在更改传入saveDataToDynamoDb()sendSlackNotification() 的参数。所以他们看到的其实是:

var saveDataToDynamoDb = function(data, cb, next) { ....

其中nextasync 库希望您调用的回调。所以你可以在cb之后调用next

var saveDataToDynamoDb = function(data, cb, next){
    ...
    DynamoDb.putItem(params, function(err, data){
        if (err) {
            cb(err, null);
            return next(err, null);
        } else {
            cb(err, null);
            return next(null, data);
        }
    });
};

【讨论】:

    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多