进程超时| 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) => { ... });