我想在我的lambda事件处理方法之外进行一些初始化,主要只是加载环境变量,但其中一些是用KMS加密的,所以我需要解密它们,但我必须等待Promise
解决。Javascript不是我的主要语言,所以我不确定实现这一目标的明智方式(如果有的话(。
我当前的实现如下所示
const controller = parseEnv(process.env).then((parsedEnv) => {
return new InstallController(parsedEnv);
});
exports.handler = async (event, context, callback) => {
const install = await controller;
return install.handle(event, context, callback);
};
理想情况下,我想将const install = await controller;
移动到exports.handler
功能之外。我可以在不使用硬编码睡眠的情况下执行此操作吗?
Lambda 是为serverless
架构设计的,这意味着如果没有任何调用,lambda 函数可能会进入"睡眠"。
然后,如果您连续调用 lambda 函数,则处理程序外部的变量已被缓存。
我将向你展示我的方式:
const initInstall = async () => {
const parsedEnv = await parseEnv(process.env);
return new InstallController(parsedEnv);
};
let install = null;
exports.handler = async (event, context, callback) => {
if (!install) {
install = await initInstall();
} else {
// Hit from "cache"
}
return install.handle(event, context, callback);
};
我重构const controller
initInstall
函数,它是一个异步函数。
并创建一个称为install
的变量来"缓存"InstallController
对象。
在handler
函数中,只需检查是否存在install
,如果没有,则将initInstall
的结果分配给install
。