我正在节点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};
有人可以帮助理解这里的问题。
答案 0 :(得分:0)
因为您使用.bind()
的方式。它正在改变传递给saveDataToDynamoDb()
和sendSlackNotification()
的参数。所以他们看到的实际上是:
var saveDataToDynamoDb = function(data, cb, next) { ....
其中next
是async
库期待您调用的回调。因此,您可以在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);
}
});
};