AWS Lambda 是一项基于事件驱动的计算服务,可以在没有预设运行时间的情况下运行代码。Node JS 是一种开源的、跨平台的 JavaScript 运行时环境。 在 AWS Lambda 和 Node JS 中,finally 块的行为不同,会对代码的执行效果产生影响。
在 Node JS 中,finally 块在 try 块和 catch 块之后执行,无论 try 块代码是否正常结束或者是否出现异常,都会执行 finally 块。例如,以下代码:
try{ console.log("Try Block"); } catch { console.log("Catch Block"); } finally { console.log("Finally Block"); }
输出结果:
Try Block Finally Block
在 AWS Lambda 中,finally 块的行为与 Node JS 不同。当当前的 Lambda 函数的运行时间到期时,finally 块不会执行,会直接结束 Lambda 函数的执行。这对需要释放资源或关闭数据库连接等情况会带来问题。
解决方法是使用 process.on('beforeExit', ()) 方法代替 finally 块。这个方法会在 event loop 中的所有 代码执行完后调用:
process.on('beforeExit', () => { console.log('Before Exit'); });
在这个方法中,可以执行资源释放和其他清理操作,确保 Lambda 函数结束时资源被正确释放。