在AWS lambda中从mongodb流式传输超时

时间:2016-09-15 09:12:40

标签: mongodb aws-lambda

我有一个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中停止此功能的超时?

2 个答案:

答案 0 :(得分:4)

在处理程序函数的开头添加以下行:

context.callbackWaitsForEmptyEventLoop = false

答案 1 :(得分:0)

请尝试以下操作:

 mongoStream.once("end", callback);

这也是用错误和结果回调,但不会丢失上下文。