AWS AppSync JavaScript 解析器概述 - AWS AppSync

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

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. 管線解析程式要求處理常式

  2. 函數 1:函數要求處理常式

  3. 第 1 個函數:資料來源呼叫

  4. 函數 1:函數響應處理程序

  5. 函數 2:函數要求處理常式

  6. 第 2 個函數:資料來源呼叫

  7. 函數 2:函數響應處理程序

  8. 管道解析器響應處理程序

GraphQL request flow diagram showing interactions between request, data sources, and response components.

實用的APPSYNC_JS執行階段內建

下列公用程式可在您使用管道解析程式時提供協助。

存儲

存儲是每個解析器和函數請求和響應處理程序中可用的對象。相同的存儲實例通過單個解析器運行存在。這意味著您可以使用存儲在請求和響應處理程序之間以及管道解析器中的函數之間傳遞任意數據。您可以像常規 JavaScript 對象一樣測試存儲。

上一頁結果

ctx.prev.result 會顯示管道先前執行操作的結果。如果先前的作業是管線解析程式要求處理常式,ctx.prev.result則可供鏈結中的第一個函數使用。如果先前操作是第一個函數,則 ctx.prev.result 會顯示第一個函數的輸出,並將資料提供給管道中的第二個函數。如果上一個操作是最後一個函數,則ctx.prev.result表示最後一個函數的輸出,並可供管線解析器響應處理程序使用。

實用程序錯誤

util.error 公用程式非常適合用來擲出欄位錯誤。在函數請求或響應處理程序中使用util.error會立即引發字段錯誤,從而防止後續函數被執行。有關更多詳細信息和其他util.error簽名,請訪問解析器和功能的JavaScript運行時功能

尤蒂爾。 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 函數使您能夠編寫可以在模式中跨多個解析器重複使用的通用邏輯。例如,您可以有一個名為的 AWS AppSync 函數QUERY_ITEMS,負責查詢 Amazon DynamoDB 資料來源中的項目。對於您想要查詢項目的解析器,只需將函數添加到解析器的管道中,並提供要使用的查詢索引即可。邏輯不必重新實現。

補充主題

主題