本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS AppSync JavaScript 解析程式概觀
AWS AppSync 可讓您透過對資料來源執行操作來回應 GraphQL 請求。對於您要執行查詢、突變或訂閱的每個 GraphQL 欄位,必須連接解析器。
解析程式是 GraphQL 與資料來源之間的連接器。它們 AWS AppSync 說明如何將傳入的 GraphQL 請求轉換為後端資料來源的指示,以及如何將來自該資料來源的回應轉換回 GraphQL 回應。使用 AWS AppSync,您可以使用 撰寫解析程式 JavaScript,並在 AWS AppSync (APPSYNC_JS
) 環境中執行。
AWS AppSync 可讓您編寫由管道中多個 AWS AppSync 函數組成的單位解析器或管道解析器。
支援的執行期功能
AWS AppSync JavaScript 執行期提供程式 JavaScript 庫、公用程式和功能的子集。如需APPSYNC_JS
執行階段支援的功能完整清單,請參閱 JavaScript 解析器和函數的執行階段功能 。
單位解析程式
單位解析器由程式碼組成,該程式碼會定義針對資料來源執行的請求和回應處理常式。請求處理常式會將內容物件作為引數,並傳回用來呼叫資料來源的請求承載。回應處理常式會從資料來源接收承載,其中包含執行請求的結果。回應處理常式會將承載轉換為 GraphQL 回應,以解析 GraphQL 欄位。在下面的範例中,解析程式會從 DynamoDB 資料來源擷取項目:
import * as ddb from '@aws-appsync/utils/dynamodb' export function request(ctx) { return ddb.get({ key: { id: ctx.args.id } }); } export const response = (ctx) => ctx.result;
JavaScript 管道解析程式的解剖結構
管道解析器由程式碼組成,該程式碼會定義請求和回應處理常式,以及函數清單。每個函數都有一個請求和回應處理常式,其會針對資料來源執行。由於管道解析器委派執行到函數清單,因此不會連結到任何資料來源。單位解析程式和函數是對資料來源執行操作的基本元素。
管道解析器請求處理常式
管道解析程式的請求處理常式 (步驟前) 可讓您在執行定義的函數之前執行一些準備邏輯。
函數清單
管道解析程式將會依序執行的函數清單。管道解析器請求處理常式評估結果會以 的形式提供給第一個 函數ctx.prev.result
。每個函數評估結果都以 的形式提供給下一個函數ctx.prev.result
。
管道解析器回應處理常式
管道解析程式的回應處理常式可讓您執行從最後一個函數輸出到預期 GraphQL 欄位類型的一些最終邏輯。函數清單中最後一個函數的輸出可在管道解析器回應處理常式中作為 ctx.prev.result
或 使用ctx.result
。
執行流程
假設管道解析器由兩個函數組成,以下清單代表呼叫解析器時的執行流程:
-
管道解析器請求處理常式
-
函數 1:函數請求處理常式
-
第 1 個函數:資料來源呼叫
-
函數 1:函數回應處理常式
-
函數 2:函數請求處理常式
-
第 2 個函數:資料來源呼叫
-
函數 2:函數回應處理常式
-
管道解析器回應處理常式
有用的APPSYNC_JS
執行期內建公用程式
下列公用程式可在您使用管道解析程式時提供協助。
ctx.stash
堆疊是在每個解析器和函數請求和回應處理常式內提供的物件。相同的堆疊執行個體透過單一解析器執行來存留。這表示您可以使用 stash 跨請求和回應處理常式,以及管道解析程式中的函數傳遞任意資料。您可以像一般 JavaScript 物件一樣測試堆疊。
ctx.prev.result
ctx.prev.result
會顯示管道先前執行操作的結果。如果先前的操作是管道解析器請求處理常式,則 ctx.prev.result
可供 鏈中的第一個函數使用。如果先前操作是第一個函數,則 ctx.prev.result
會顯示第一個函數的輸出,並將資料提供給管道中的第二個函數。如果先前的操作是最後一個函數,則 ctx.prev.result
代表最後一個函數的輸出,並提供給管道解析器回應處理常式。
util.error
util.error
公用程式非常適合用來擲出欄位錯誤。在函數請求或回應處理常式util.error
內使用 會立即擲回欄位錯誤,以防止後續函數執行。如需更多詳細資訊和其他util.error
簽章,請造訪JavaScript解析器和函數的執行期功能 。
util.appendError
util.appendError
類似於 util.error()
,主要區別是它不會中斷處理常式的評估。相反地,它表示 欄位發生錯誤,但允許評估處理常式並因此傳回資料。在函數中使用 util.appendError
並不會中斷管道的執行流程。如需更多詳細資訊和其他util.error
簽章,請造訪JavaScript 解析器和函數的執行期功能 。
執行時間。earlyReturn
該runtime.earlyReturn
函數可讓您從任何請求函數中提早傳回 。使用解析器請求處理常式runtime.earlyReturn
的內部 會從解析器傳回 。從 AWS AppSync 函數請求處理常式呼叫它會從函數傳回,並會繼續執行至管道中的下一個函數或解析程式回應處理常式。
寫入管道解析程式
管道解析程式也具有請求和圍繞管道中函數執行的回應處理常式:其請求處理常式會在第一個函數的請求之前執行,而其回應處理常式會在最後一個函數的回應之後執行。解析器請求處理常式可以設定要供管道中函數使用的資料。解析器回應處理常式負責傳回對應至 GraphQL 欄位輸出類型的資料。在下面的範例中,解析程式請求處理常式定義 allowedGroups
;傳回的資料應屬於其中一個群組。解析器的函數可以使用此值來請求資料。解析程式的回應處理常式會執行最終檢查並篩選結果,以確保僅傳回屬於允許群組的項目。
import { util } from '@aws-appsync/utils'; /** * Called before the request function of the first AppSync function in the pipeline. * @param ctx the context object holds contextual information about the function invocation. */ export function request(ctx) { ctx.stash.allowedGroups = ['admin']; ctx.stash.startedAt = util.time.nowISO8601(); return {}; } /** * Called after the response function of the last AppSync function in the pipeline. * @param ctx the context object holds contextual information about the function invocation. */ export function response(ctx) { const result = []; for (const item of ctx.prev.result) { if (ctx.stash.allowedGroups.indexOf(item.group) > -1) result.push(item); } return result; }
寫入 AWS AppSync 函數
AWS AppSync 函數可讓您撰寫常用邏輯,以便在結構描述中的多個解析器之間重複使用。例如,您可以有一個名為 QUERY_ITEMS
的 AWS AppSync 函數,負責從 Amazon DynamoDB 資料來源查詢項目。對於您要查詢項目的解析程式,只需將函數新增至解析程式的管道,並提供要使用的查詢索引。邏輯不需要重新實作。
補充主題
主題