【发布时间】: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