我有一个lambda函数,它连接到mongodb数据库并从数据库中传输一些记录。
exports.handler = (event, context, callback) => {
let url = event.mongodbUrl;
let collectionName = event.collectionName;
MongoClient.connect(url, (error, db) => {
if (error) {
console.log("Error connecting to mongodb: ${error}");
callback(error);
} else {
console.log("Connected to mongodb");
let events = [];
console.log("Streaming data from mongodb...");
let mongoStream = db.collection(collectionName).find().sort({ _id : -1 }).limit(500).stream();
mongoStream.on("data", data => {
events.push(data);
});
mongoStream.once("end", () => {
console.log("Stream ended");
db.close(() => {
console.log("Database connection closed");
callback(null, "Lambda function succeeded!!");
});
});
}
});
};
当流结束时,我关闭数据库连接并调用应该结束lambda函数的回调函数。这在本地使用node-lambda,但是当我尝试在AWS lambda中运行它时,我得到所有日志,包括console.log("Database connection closed");
,但回调似乎没有被调用,所以函数尽管最后一次记录是在超时前几秒发生的,但总是超时。
我可以使用context.succeed()
强制它结束,但在使用节点版本4时似乎不赞成使用它,所以我想避免使用它。如何在AWS lambda中停止此功能的超时?
答案 0 :(得分:4)
在处理程序函数的开头添加以下行:
context.callbackWaitsForEmptyEventLoop = false
答案 1 :(得分:0)
请尝试以下操作:
mongoStream.once("end", callback);
这也是用错误和结果回调,但不会丢失上下文。