本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS AppSync JavaScript Lambda 的解析器函數參考
您可以使用 AWS AppSync 函數和解析程式來叫用您帳戶中的 Lambda 函數。您可以在將請求承載傳回給用戶端之前,先從 Lambda 函數塑造請求承載和回應。您也可以指定要在請求物件中執行的操作類型。本節說明支援 Lambda 操作的請求。
請求物件
Lambda 請求物件會處理與您 Lambda 函數相關的欄位:
export type LambdaRequest = { operation: 'Invoke' | 'BatchInvoke'; invocationType?: 'RequestResponse' | 'Event'; payload: unknown; };
以下是使用 invoke
操作的範例,其承載資料是來自 GraphQL 結構描述getPost
的欄位,以及來自內容的引數:
export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }
整個映射文件會作為 Lambda 函數的輸入傳遞,因此先前的範例現在如下所示:
{ "operation": "Invoke", "payload": { "field": "getPost", "arguments": { "input": { "id": "postId1", } } } }
作業
Lambda 資料來源可讓您在 operation
欄位定義兩個操作: Invoke
和 BatchInvoke
。Invoke
操作會讓 AWS AppSync 知道呼叫每個 GraphQL 欄位解析器的 Lambda 函數。 BatchInvoke
會指示 AWS AppSync 批次處理目前 GraphQL 欄位的請求。operation
欄位是必要的。
對於 Invoke
,解析的請求符合 Lambda 函數的輸入承載。讓我們修改上述範例:
export function request(ctx) { return { operation: 'Invoke', payload: { field: 'getPost', arguments: ctx.args }, }; }
這會解決並傳遞給 Lambda 函數,看起來可能會類似這樣:
{ "operation": "Invoke", "payload": { "arguments": { "id": "postId1" } } }
對於 BatchInvoke
,請求會套用至批次中的每個欄位解析器。為了簡潔起見, 會將所有請求payload
值 AWS AppSync 合併到符合請求物件的單一物件下的清單中。下列範例請求處理常式會顯示合併:
export function request(ctx) { return { operation: 'Invoke', payload: ctx, }; }
此請求會進行評估並解析為下列映射文件:
{ "operation": "BatchInvoke", "payload": [ {...}, // context for batch item 1 {...}, // context for batch item 2 {...} // context for batch item 3 ] }
payload
清單的每個元素對應至單一批次項目。Lambda 函數也會傳回符合請求中傳送項目順序的清單形狀回應:
[ { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 1 { "data": {...}, "errorMessage": null, "errorType": null }, // result for batch item 2 { "data": {...}, "errorMessage": null, "errorType": null } // result for batch item 3 ]
承載
payload
欄位是用於將任何資料傳遞至 Lambda 函數的容器。如果 operation
欄位設定為 BatchInvoke
, 會將現有payload
值 AWS AppSync 包裝到清單中。此 payload
欄位為選用。
調用類型
Lambda 資料來源可讓您定義兩種叫用類型: RequestResponse
和 Event
。叫用類型與 Lambda API中定義的叫用類型同義。RequestResponse
叫用類型可讓 同步 AWS AppSync 呼叫 Lambda 函數,以等待回應。調Event
用可讓您以非同步方式調用 Lambda 函數。如需 Lambda 如何處理Event
調用類型請求的詳細資訊,請參閱非同步調用 。此 invocationType
欄位為選用。如果請求中不包含此欄位, AWS AppSync 將預設為RequestResponse
叫用類型。
對於任何invocationType
欄位,解析的請求都會符合 Lambda 函數的輸入承載。讓我們修改上述範例:
export function request(ctx) { return { operation: 'Invoke', invocationType: 'Event', payload: { field: 'getPost', arguments: ctx.args }, }; }
這會解決並傳遞給 Lambda 函數,看起來可能會類似這樣:
{ "operation": "Invoke", "invocationType": "Event", "payload": { "arguments": { "id": "postId1" } } }
當 BatchInvoke
操作與Event
調用類型欄位搭配使用時, 會以上述相同方式 AWS AppSync 合併欄位解析器,並將請求作為非同步事件傳遞給您的 Lambda 函數,其中 payload
是值清單。Event
調用類型請求的回應會產生沒有回應處理常式null
的值:
{ "data": { "field": null } }
我們建議您停用Event
呼叫類型解析器的解析器快取,因為如果有快取命中,這些項目不會傳送至 Lambda。
回應物件
與其他資料來源一樣,您的 Lambda 函數會將回應傳送至 AWS AppSync ,必須轉換為 GraphQL 類型。Lambda 函數的結果包含在context
結果屬性 () 中context.result
。
如果您的 Lambda 函數回應的形狀符合 GraphQL 類型的形狀,您可以使用下列函數回應處理常式轉送回應:
export function response(ctx) { return ctx.result }
沒有套用至回應物件的必填欄位或形狀限制。不過,由於 GraphQL 是強烈輸入,因此解析的回應必須符合預期的 GraphQL 類型。
Lambda 函數批次回應
如果 operation
欄位設定為 BatchInvoke
, AWS AppSync 預期會從 Lambda 函數傳回項目清單。為了讓 AWS AppSync 將每個結果對應回原始請求項目,回應清單必須依大小和順序相符。在回應清單中有null
項目是有效的; ctx.result
會相應地設定為 null。