AWS AppSync JavaScript Lambda 的解析器函數參考 - AWS AppSync GraphQL

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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 欄位定義兩個操作: InvokeBatchInvokeInvoke 操作會讓 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 資料來源可讓您定義兩種叫用類型: RequestResponseEvent。叫用類型與 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