2016-08-11 81 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邏輯的代碼無需關心 - 它只是想知道它應該連接到哪裏。

相關問題