AWS LambdaNode.js 中的 函數處理常式
Lambda 函數處理常式是您的函數程式碼中處理事件的方法。當有人呼叫您的函數時,Lambda 會執行處理常式方法。當處理常式結束或傳回回應時,就可以處理另一個事件。
以下範例函式紀錄事件物件的內容和傳回日誌的位置。
範例 index.js
exports.handler = async function(event, context) { console.log("EVENT: \n" + JSON.stringify(event, null, 2)) return context.logStreamName }
當您設定函數時,處理常式的設定值就是檔案名稱,以及已匯出之處理常式方法的名稱,並且以點分隔。主控台中的預設值,例如在此指南中為 index.handler
。這表示 handler
方法是透過 index.js
檔案匯出的。
執行時間通過三個引述到處理常式方法。第一個引數是 event
物件,其中包含來自叫用端的資訊。呼叫者會在呼叫 Invoke 時,以 JSON 格式的字串傳遞此資訊,然後執行時間將它轉換為物件。當 AWS 服務叫用您的函式時,事件結構會依服務變化。
第二個引數為 內容物件,其中包含有關呼叫、函式和執行環境的資訊。在上述範例中,該函式從內容物件取得日誌串流的名稱並傳回給叫用端。
第三個引數為 callback
,這是您可以在非異步處理常式中呼叫以傳送回應的函數。回乎函式需要兩個引數,一個 Error
和回應。當您呼叫函數時,Lambda 會等待事件循環為空,然後將回應或錯誤傳回給叫用者。回應物件必須與 JSON.stringify
相容。
對於非同步函數,您傳回回應、錯誤或承諾到執行時間,而不是使用 callback
。
如果您的函數有額外的相依項,使用 npm 將它們包含在您的部署套件中。
非同步處理常式
對於非同步函數,您可以使用 return
和 throw
傳送回應或錯誤。函式必須使用 async
關鍵字來使用這些方法傳回回應或錯誤。
如果您的程式碼執行非同步任務,則會傳回承諾以確保完成執行。當您解決或拒絕承諾,則 Lambda 傳送回應或錯誤給叫用者。
範例 index.js 檔案 - 具有非同步處理常式和承諾的 HTTP 請求
const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler =
async
function(event) { const promise = new Promise(function(resolve, reject) { https.get(url, (res) => { resolve(res.statusCode) }).on('error', (e) => { reject(Error(e)) }) }) return promise }
對於程式庫的傳回承諾,您可以直接傳回承諾到執行時間。
範例 index.js 檔案 - 具有非同步處理常式和承諾的 AWS 開發套件
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async function(event) { return s3.listBuckets().promise() }
使用 Node.js 模組和頂級等待
您可以將函數程式碼指定為 ES 模組,允許您使用位於檔案最上層的 await
,超出了函數處理常式的範圍。這可以保證在處理常式叫用之前完成異步初始化程式碼,從而在降低冷啟動延遲方面最大限度地提高佈建並行的效率。您可利用兩種方式進行:在函數的 package.json
檔案中將 type
指定為 module
,或使用 .mjs 副檔名。
在第一種情況下,函數程式碼將所有 .js 檔案視為 ES 模組,而在第二種情況下,只有使用 .mjs 指定的檔案為 ES 模組。可以透過分別將它們命名為 .mjs 和 .cjs 來混合 ES 模組和 CommonJS 模組,因為 .mjs 檔案始終是 ES 模組,而 .cjs 檔案始終是 CommonJS 模組。
如需詳細資訊和範例,請參閱在 AWS Lambda 中使用 Node.js ES 模組和頂級等待
非異步處理常式
以下範例函式檢查 URL 及傳回狀態碼給叫用端。
範例 index.js 檔案 - 具有回呼的 HTTP 請求
const https = require('https') let url = "https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" exports.handler = function(event, context, callback) { https.get(url, (res) => {
callback(null, res.statusCode)
}).on('error', (e) => {callback(Error(e))
}) }
對於非異步處理常式,函數將繼續執行,直到事件迴圈
在下列範例中,Amazon S3 的回應會在可用時立即傳回給叫用者。逾時的事件迴圈已凍結,並繼續執行下一個時間叫用的函式。
範例 index.js 檔案 - callbackWaitsForEmptyEventLoop
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = function(event, context, callback) { context.callbackWaitsForEmptyEventLoop = false s3.listBuckets(null, callback) setTimeout(function () { console.log('Timeout complete.') }, 5000) }