async.parallel在使用lambda函数时不执行最后的cllback函数

时间:2016-01-04 21:31:14

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

我正在节点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};

有人可以帮助理解这里的问题。

1 个答案:

答案 0 :(得分:0)

因为您使用.bind()的方式。它正在改变传递给saveDataToDynamoDb()sendSlackNotification()的参数。所以他们看到的实际上是:

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

其中nextasync库期待您调用的回调。因此,您可以在next之后致电cb

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);
        }
    });
};