【问题标题】:Accessing Lambda context object in other files访问其他文件中的 Lambda 上下文对象
【发布时间】:2016-08-12 04:49:06
【问题描述】:

我有一个包含多个文件的 NodeJS AWS Lambda 函数。在 index.js 中,我执行常规的 exports.handler = function (event,context) {…}

我还有一个 config.js 文件,它处理各种设置和 module.exports 一个配置对象。此配置文件在其他几个都需要访问这些设置(默认值、数据库设置等)的文件中是必需的。我不一定需要在 index.js 本身中使用它。

但是,我需要根据 Lambda 函数的别名(例如要使用哪个 DynamoDB 表后缀)在 config 模块中进行一些设置。虽然在exports.handler 中通过context.invokedFunctionArn(在我的情况下为PROD 或STAGE)获取别名没有问题,但我无法在我的配置文件中访问它(到处都是必需的)。

使上下文对象在我的配置模块中可用的最佳方法是什么?如何在不遇到循环依赖关系的情况下做到这一点(因为在 export.handler 完成之前需要它)?

在exports.handler 内部,来自多个文件的大量异步代码都需要执行配置。他们都需要知道运行的是哪个别名。

问题不在于如何使用别名,而在于如何使上下文对象在其他文件中可用。

谢谢!

【问题讨论】:

  • 在调用处理函数之前上下文对象永远不可用。您需要等到处理函数被调用,然后才能执行任何需要来自上下文对象的数据的操作。

标签: javascript node.js aws-lambda


【解决方案1】:

在调用异步函数之前,只需在处理程序顶部设置变量:

const config = require('./config')
const someAsyncFunction = require('./someAsyncFunction')
exports.handler = function (event, context) {
  config.invokedFunctionArn = context.invokedFunctionArn
  someAsyncFunction().then(context.succeed, context.fail)
}

【讨论】:

  • 谢谢,这几行非常有帮助。我之前做过类似的操作,但是之前另一个文件(2 级深)需要的另一个文件需要该配置,因此被缓存并且不能(轻松)再更改。阅读一个简化的例子有助于理清思路:-)。我的配置模块现在包含一个特定设置的函数,该函数将 env 作为参数,然后返回我需要的环境准备实例,并由在处理程序内部执行的代码调用。再次感谢您朝着正确的方向前进。
【解决方案2】:

我会更改您的异步函数以接受“环境”参数。然后在您的处理程序中,检查调用的 ARN 并提取别名,然后将其映射到支持的环境类型。将该环境作为参数传递给您的函数。

这将您的其他库与 lambda 调用的任何知识分离,并且使事情更容易在日光下进行测试。 Lambda 处理程序可以知道它的别名类型以及它们的含义。实际执行 DynamoDB 逻辑的代码不需要关心这些 - 它只是想知道它应该连接到哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-09-05
    相关资源
    最近更新 更多