2016-08-11 76 views
1

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

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

然而,我需要根据lambda函数(例如要使用的DynamoDB表后缀)的别名设置config模块内的一些设置。虽然在exports.handler中通过context.invokedFunctionArn(在我的情况下是PROD或STAGE)取得别名是没有问题的,但我无法在我的配置文件中访问它(这是遍布全球的必需)。

什么是做在我的配置模块提供的上下文对象的最佳方式,我会怎么做,而不会在循环依赖(因为它之前需要exports.handler结束)?

内exports.handler从多个文件所有需要执行配置了大量的异步代码。他们都需要知道哪个别名正在运行。

的问题已经不再是如何使用的别名,但更多的是如何使在其他文件中提供的上下文对象。

谢谢!

+0

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

回答

1

就在你的处理器的顶部,你调用异步函数之前设置的变量:

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

谢谢,这几行很有帮助。我以前做过类似的事情,但之前配置文件需要另一个文件(2层深),因此缓存,不能(很容易)改变了。读一个简单的例子有助于清除头脑:-)。我的配置模块现在包含一个特定设置的函数,它将env作为参数,然后返回一个我准备好的用于环境的实例,并由在处理程序中执行的代码调用。再次感谢您的正确方向。 – user1683766

0

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

这从拉姆达调用的任何知识的解耦其他图书馆,它使事情变得更容易在日晒测试。 Lambda处理程序可以知道它的别名类型,以及它们的含义。实际上执行DynamoDB逻辑的代码无需关心 - 它只是想知道它应该连接到哪里。

相关问题