进程超时| Amazon Lambda到Firebase

我在node.js中编写了代码,我的数据在Firebase上。 我面临的问题是,我的代码永远不会退出。 我已经做了这样一个链接

问题是,firebase参考/听众永远不会成为空,因此我的function永远不会退出。 我尝试使用firebase.database().goOffline()但它没有工作。

在我的本地机器上,我使用process.exit(0)强制停止进程,但是当我在AWS lambda上部署代码时,它不返回任何响应/callback并退出(给出错误消息“ 在完成请求之前退出进程 ” )

在lambda中调用callback之后,我还添加了5-10秒的等待时间,然后强制退出了这个过程,但是也没有帮助。

如何解决这个问题? 请帮忙。

你遇到任何新的lambda用户已经过去的危机。

如上所示,你可以使用context.done来停止。 但是 ,不build议这样做,因为这只能由于nodejs的历史运行时版本才有可能。


为什么这个超时发生?

你的lambda可能会到达你的代码的最后一行,仍然继续运行。 那么,它实际上是在等待一些事情 – 事件循环是空的。

这是什么意思?

在nodejs中,当你做一个asynchronous操作并注册了一个callback函数,一旦操作完成,注册sorting在事件循环中发生。

在一行中,事件循环知道在asynchronous操作结束时执行哪个callback函数。 但这是另一个线程:)


回到Lambda

根据上面的信息,lambda 不应该在空事件循环到达之前停止,因为这意味着某些后续过程在一些asynchronous操作返回后不会执行。

如果您仍然需要手动停止执行,该怎么办? 不pipe事件循环状态如何? 在函数的开头,执行:

 context.callbackWaitsForEmptyEventLoop = false 

然后使用处理器签名中获得的第三个参数。 这是callback

callback参数

当你想要结束执行时,这是一个你要调用的函数。

如果不带任何参数调用它,或者第一个参数为null,第二个参数为text,则认为调用成功。

要使lambda执行失败,可以使用一些非空值作为第一个参数来调用callback函数。

在你的处理函数的开头添加这一行,然后你应该能够使用callback没有问题:

 function handler (event, context, callback) { context.callbackWaitsForEmptyEventLoop = false // Add this line } 

调用callback funciton然后process.exit(0)没有帮助我的情况。 goOffline()方法也没有帮助。

我解决了调用context.done(error, response) (而不是callback方法)的问题。 现在,我的代码正在工作。

不过,如果有人有更好的解决方法,请在这里发帖。 这可能会帮助别人:)

callbackWaitsForEmptyEventLoop设置为false应该只是你最后的手段,如果没有其他的东西适合你,因为这可能会导致比你想要解决的问题更糟的错误。

这是我所做的,而不是确保每个调用都有firebase初始化,并在退出之前删除。

 // handlerWithFirebase.js const admin = require("firebase-admin"); const config = require("./config.json"); function initialize() { return admin.initializeApp({ credential: admin.credential.cert(config), databaseURL: "https://<your_app>.firebaseio.com", }); } function handlerWithFirebase(func) { return (event, context, callback) => { const firebase = initialize(); let _callback = (error, result) => { firebase.delete(); callback(error, result); } // passing firebase into your handler here is optional func(event, context, _callback, firebase /*optional*/); } } module.exports = handlerWithFirebase; 

然后在我的lambda处理程序代码中

 // myHandler.js const handlerWithFirebase = require("../firebase/handler"); module.exports.handler = handlerWithFirebase( (event, context, callback, firebase) => { ... });