管線解析器 (VTL) - AWS AppSync

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

管線解析器 (VTL)

注意

我們現在主要支援 APPSYNC_JS 執行階段及其說明文件。請考慮在此處使用 APPSYNC_JS 執行階段及其指南。

AWS AppSync 在 GraphQL 欄位上執行解析程式。在某些情況下,應用程式需要執行多個操作,才能解析單一 GraphQL 欄位。使用管道解析器,開發人員現在可以撰寫稱為 Functions 的操作並按順序執行它們。在像是以需要先執行授權檢查才能擷取欄位資料的情況中,就很適合使用管道解析程式。

管道解析程式包含 Before 映射範本和 After 映射範本,以及一份函數清單。每個函數都有一個請求響應映射模板,它對數據源執行。由於管道解析程式是將執行委派到一份函數清單,所以不會連結到任何資料來源。單元解析器和函數是對數據源執行操作的基元。如需詳細資訊,請參閱解析器對映範本概觀

建立管道解析程式

在 AWS AppSync ​ 主控台中,移至Schema (結構描述) 頁面。

儲存下列結構描述:

schema { query: Query mutation: Mutation } type Mutation { signUp(input: Signup): User } type Query { getUser(id: ID!): User } input Signup { username: String! email: String! } type User { id: ID! username: String email: AWSEmail }

我們將連接一個管道解析器到突變類型上 sign U p 字段。在右側的「突變類型」中,選擇「signUp突變」欄位旁邊的「附加」。在「創建解析器」頁面上,單擊「操作」,然後單擊「更新時」。選擇Pipeline Resolver,然後選擇VTL,然後選擇更新。此頁面現在應該會顯示三個區段:「對映前範本」文字區域、「函數」區段和「後對映範本」文字區域。

我們的管道解析程式會註冊使用者,此註冊的第一步是驗證電子郵件地址輸入,然後在系統中儲存此位使用者。我們將在 validateEmail 函數中封裝該電子郵件驗證,並在 saveUser 函數中封裝使用者儲存步驟。validateEmail 函數會先執行,而當電子郵件驗證有效時,saveUser 函數就會接著執行。

執行流程將如下所示:

  1. Mutation.signUp 解析程式要求映射範本

  2. validateEmail 函數

  3. saveUser 函數

  4. Mutation.signUp 解析程式回應映射範本

因為我們可能會在我們的 API 上的其他解析器中重複使用 validateEmail 函數,所以我們希望避免訪問,$ctx.args因為這些將從一個 GraphQL 字段更改為另一個字段。反之,我們可以使用 $ctx.stash 來存放 signUp(input: Signup) 輸入欄位引數所傳遞的電子郵件屬性。

之前對映範本:

## store email input field into a generic email key $util.qr($ctx.stash.put("email", $ctx.args.input.email)) {}

控制台提供了一個默認的傳遞 AF TER 映射模板,我們將使用它:

$util.toJson($ctx.result)

選擇「建立」或「儲存」以更新解析程式。

建立函數

在管線解析器頁面的函數區段中,按一下新增函數,然後按一下建立新函數也可以在不經過解析器頁面的情況下創建函數; 要做到這一點,在AWS AppSync控制台中,轉到 Functions 頁面。選擇 Create function (建立函數) 按鈕。讓我們來建立可檢查電子郵件是否有效且來源是特定網域的函數。如果電子郵件無效,則該函數會引發錯誤。否則,它會轉送任何獲予的任何輸入。

在新功能頁面上,選擇動作,然後選擇更新執行階段。選擇VTL,然後選擇更新。請確定您已建立 NONE 類型的資料來源。在「資料來源名稱」清單中選擇此資料來源。對於函數名稱,請輸入 in validateEmail。在函數代碼區域中,用這個代碼片段覆蓋所有內容:

#set($valid = $util.matches("^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?(myvaliddomain)\.com", $ctx.stash.email)) #if (!$valid) $util.error("$ctx.stash.email is not a valid email.") #end { "payload": { "email": $util.toJson(${ctx.stash.email}) } }

將其粘貼到響應映射模板中:

$util.toJson($ctx.result)

檢閱您的變更,然後選擇「建立」。我們已建立我們 validateEmail 函數。重複這些步驟,使用以下請求和響應映射模板創建 saveUser 函數(為了簡單起見,我們使用 NONE 數據源並假裝該用戶在函數執行後已保存在系統中。 ):

要求映射範本:

## $ctx.prev.result contains the signup input values. We could have also ## used $ctx.args.input. { "payload": $util.toJson($ctx.prev.result) }

回應映射範本:

## an id is required so let's add a unique random identifier to the output $util.qr($ctx.result.put("id", $util.autoId())) $util.toJson($ctx.result)

我們剛剛創建了我們的 saveUser 功能。

新增函數到管道解析程式

我們的函數應該已經自動添加到我們剛剛創建的管道解析器中。如果不是這種情況,或者您通過「函數」頁面創建了數,則可以單擊解析器頁面上的添加函數以附加它們。兩個 validateEmailsaveUser 功能添加到解析器。validateEmail 函數應該放在 saveUser 函數之前。當您新增更多函數時,您可以使用「上移」和「下移」選項來重新組織函數的執行順序。檢閱您的變更,然後選擇 [儲存]。

執行查詢

在 ​AWS AppSync 主控台中,移至Queries (查詢) 頁面。在資源管理器中,確保您正在使用突變。如果不是,請Mutation在下拉式清單中選擇,然後選擇+。輸入下列查詢:

mutation { signUp(input: { email: "nadia@myvaliddomain.com" username: "nadia" }) { id email } }

這應該返回如下內容:

{ "data": { "signUp": { "id": "256b6cc2-4694-46f4-a55e-8cb14cc5d7fc", "email": "nadia@myvaliddomain.com" } } }

我們已使用管道解析程式成功註冊我們的使用者,並完成輸入電子郵件的驗證。若要取得更多著重管道解析程式的全面教學課程,您可以移至教學課程:管道解析程式