建立基本查詢 (JavaScript) - AWS AppSync

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

建立基本查詢 (JavaScript)

GraphQL 解析程式將類型結構描述中的欄位連接到資料來源。解析程式是滿足請求的機制。

解析程式 AWS AppSync 用來 JavaScript 將 GraphQL 表達式轉換為資料來源可以使用的格式。或者,映射範本可以用 Apache Velocity 範本語言 (VTL) 撰寫,將 GraphQL 表達式轉換為資料來源可以使用的格式。

本節說明如何使用 設定解析器 JavaScript。Resolver 教學課程 (JavaScript) 章節提供如何使用 實作解析程式的深入教學課程 JavaScript。Resolver 參考 (JavaScript) 區段提供可搭配 JavaScript 解析器使用的公用程式操作說明。

我們建議您先遵循本指南,然後再嘗試使用上述任何教學課程。

在本節中,我們將逐步說明如何建立和設定查詢和突變的解析器。

注意

本指南假設您已建立結構描述,且至少有一個查詢或突變。如果您要尋找訂閱 (即時資料),請參閱本指南

在本節中,我們將提供一些設定解析器的一般步驟,以及使用下列結構描述的範例:

// schema.graphql file input CreatePostInput { title: String date: AWSDateTime } type Post { id: ID! title: String date: AWSDateTime } type Mutation { createPost(input: CreatePostInput!): Post } type Query { getPost: [Post] }

建立基本查詢解析程式

本節將示範如何建立基本查詢解析程式。

Console
  1. 登入 AWS Management Console 並開啟AppSync主控台

    1. APIs儀表板 中,選擇您的 GraphQL API。

    2. Sidebar 中,選擇結構描述

  2. 輸入您的結構描述和資料來源的詳細資訊。如需詳細資訊,請參閱設計您的結構描述連接資料來源章節。

  3. 結構描述編輯器旁邊,有一個名為解析程式 的視窗。此方塊包含結構描述視窗中定義的類型和欄位清單。您可以將解析器連接至 欄位。您很可能將解析器連接至您的欄位操作。在本節中,我們將探討簡單的查詢組態。在查詢類型下,選擇查詢欄位旁的連接

  4. 連接解析程式頁面的解析程式類型 下,您可以選擇管道或單位解析程式。如需這些類型的詳細資訊,請參閱解析程式 。本指南將使用 pipeline resolvers

    提示

    建立管道解析程式時,您的資料來源會連接至管道函數 (s)。函數會在您建立管道解析程式本身之後建立,因此此頁面中沒有設定函數的選項。如果您使用的是單位解析器,則資料來源會直接與解析器綁定,因此您會在此頁面中設定。

    針對 Resolver 執行期 ,選擇 APPSYNC_JS 以啟用 JavaScript 執行期。

  5. 您可以為此 啟用快取API。建議您立即關閉此功能。選擇 Create (建立)。

  6. 編輯解析程式頁面上,有一個名為解析程式程式碼的程式碼編輯器,可讓您實作解析程式處理程式和回應的邏輯 (步驟前後)。如需詳細資訊,請參閱JavaScript解析程式概觀

    注意

    在我們的範例中,我們只會將請求和回應集保留空白,以傳回內容 中的最後一個資料來源結果:

    import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }

    本節下方有一個名為 Functions 的資料表。函數可讓您實作可在多個解析器間重複使用的程式碼。您可以將原始程式碼儲存為可在需要時新增至解析器的函數,而不是不斷重寫或複製程式碼。

    函數構成管道操作清單的大量。在解析器中使用多個函數時,您可以設定函數的順序,並將按該順序執行。它們會在請求函數執行之後,以及回應函數開始之前執行。

    若要新增函數,請在函數 下,選擇新增函數 ,然後選擇建立新函數 。或者,您可能會看到建立函數按鈕來選擇。

    1. 選擇資料來源。這將是解析程式在其上執行動作的資料來源。

      注意

      在我們的範例中,我們正在連接 的解析器getPost,該解析器會藉由 擷取Post物件id。假設我們已經為此結構描述設定 DynamoDB 資料表。其分割區金鑰設定為 id,且為空白。

    2. 輸入 Function name

    3. 函數程式碼 下,您需要實作函數的行為。這可能令人困惑,但每個函數都會有自己的本機請求和回應處理常式。執行請求,然後進行資料來源調用來處理請求,然後由回應處理常式處理資料來源回應。結果會儲存在內容物件中。之後,清單中的下一個函數會執行,如果是最後一個函數,則會傳遞給步驟後回應處理常式。

      注意

      在我們的範例中,我們會將解析器連接至 getPost,從資料來源取得Post物件清單。我們的請求函數會從我們的資料表請求資料,資料表會將回應傳遞至內容 (ctx),然後回應會在內容中傳回結果。 AWS AppSync的強度在於其與其他 AWS 服務的互連性。由於我們使用 DynamoDB ,因此我們有一套操作來簡化這類操作。我們也有一些其他資料來源類型的樣板範例。

      我們的程式碼看起來像這樣:

      import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned post items */ export function response(ctx) { return ctx.result.items; }

      在此步驟中,我們新增了兩個函數:

      • request:請求處理常式會根據資料來源執行擷取操作。引數包含內容物件 (ctx),或執行特定操作的所有解析器可用的部分資料。例如,它可能包含授權資料、正在解析的欄位名稱等。傳回陳述式會執行 Scan操作 (如需範例,請參閱此處)。因為我們使用的是 DynamoDB ,因此我們可以使用該服務的一些操作。掃描會執行資料表中所有項目的基本擷取。此操作的結果會以result容器的形式存放在內容物件中,然後再傳遞給回應處理常式。在管道中的回應之前request執行 。

      • response:傳回 輸出的回應處理常式request。引數是更新的內容物件,而傳回陳述式是 ctx.prev.result。在本指南的這個時候,您可能不熟悉此值。 ctx是指內容物件。 prev是指管道中的上一個操作,也就是我們的 requestresult 包含解析器在管道中移動時的結果 (s)。如果您將所有操作整合在一起, ctx.prev.result 會傳回上次執行的操作結果,也就是請求處理常式。

    4. 完成後選擇建立

  7. 返回解析器畫面,在函數 下,選擇新增函數下拉式清單,並將函數新增至函數清單。

  8. 選擇儲存以更新解析程式。

CLI

若要新增函數

  • 使用 create-function命令為您的管道解析器建立函數。

    您需要為此特定命令輸入幾個參數:

    1. api-id的 API。

    2. AWS AppSync 主控台中函數name的 。

    3. 函數將使用的資料來源名稱 data-source-name或 。必須已在 AWS AppSync 服務API中建立並連結至您的 GraphQL。

    4. 函數的 runtime、 或 環境和語言。對於 JavaScript,名稱必須為 APPSYNC_JS,執行期為 1.0.0

    5. 函數的 code、 或 請求和回應處理常式。雖然您可以手動輸入,但將其新增至 .txt 檔案 (或類似格式),然後將其傳遞為引數會更容易。

      注意

      我們的查詢程式碼將位於傳入的檔案中,作為引數:

      import { util } from '@aws-appsync/utils'; /** * Performs a scan on the dynamodb data source */ export function request(ctx) { return { operation: 'Scan' }; } /** * return a list of scanned post items */ export function response(ctx) { return ctx.result.items; }

    範例命令可能如下所示:

    aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name get_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file://~/path/to/file/{filename}.{fileType}

    輸出會在 中傳回CLI。範例如下:

    { "functionConfiguration": { "functionId": "ejglgvmcabdn7lx75ref4qeig4", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/ejglgvmcabdn7lx75ref4qeig4", "name": "get_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output goes here" } }
    注意

    請務必在functionId某處記錄 ,因為這將用於將函數連接至解析器。

建立您的解析器

  • Query 執行 create-resolver命令來建立 的管道函數。

    您需要為此特定命令輸入幾個參數:

    1. api-id的 API。

    2. 結構描述中的 type-name或特殊物件類型 (查詢、突變、訂閱)。

    3. field-name,或您要連接解析器之特殊物件類型內的欄位操作。

    4. kind,指定單位或管道解析器。將此設定為 PIPELINE 以啟用管道函數。

    5. 要連接至解析器的 pipeline-config、 或 (多個) 函數。請務必了解函數functionId的值。清單的順序很重要。

    6. runtime,即 APPSYNC_JS(JavaScript)。runtimeVersion 目前為 1.0.0

    7. code,其中包含步驟處理常式前後的 。

      注意

      我們的查詢程式碼將位於傳入的檔案中,作為引數:

      import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }

    範例命令可能如下所示:

    aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Query \ --field-name getPost \ --kind PIPELINE \ --pipeline-config functions=ejglgvmcabdn7lx75ref4qeig4 \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}

    輸出會在 中傳回CLI。範例如下:

    { "resolver": { "typeName": "Mutation", "fieldName": "getPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/getPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "ejglgvmcabdn7lx75ref4qeig4" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output goes here" } }
CDK
提示

使用 之前CDK,建議您檢閱 CDK的正式文件以及 AWS AppSync的CDK參考

下列步驟只會顯示用來新增特定資源的程式碼片段的一般範例。這並非生產程式碼中的有效解決方案。我們也假設您已經有運作中的應用程式。

基本應用程式將需要下列項目:

  1. 服務匯入指令

  2. 結構描述程式碼

  3. 資料來源產生器

  4. 函數程式碼

  5. 解析程式程式碼

設計結構描述連接資料來源區段中,我們知道堆疊檔案將包含 表單的匯入指令:

import * as x from 'x'; # import wildcard as the 'x' keyword from 'x-service' import {a, b, ...} from 'c'; # import {specific constructs} from 'c-service'
注意

在先前的章節中,我們只說明了如何匯入 AWS AppSync 建構。在真實程式碼中,您必須匯入更多服務,才能執行應用程式。在我們的範例中,如果我們要建立非常簡單的CDK應用程式,我們至少會匯入 AWS AppSync 服務以及資料來源,也就是 DynamoDB 資料表。我們也需要匯入一些額外的建構,才能部署應用程式:

import * as cdk from 'aws-cdk-lib'; import * as appsync from 'aws-cdk-lib/aws-appsync'; import * as dynamodb from 'aws-cdk-lib/aws-dynamodb'; import { Construct } from 'constructs';

若要總結下列各項:

  • import * as cdk from 'aws-cdk-lib';:這可讓您定義CDK應用程式和建構,例如堆疊。它還包含一些實用的公用程式函數,例如操作中繼資料。如果您熟悉此匯入指令,但想知道為何此處未使用 cdk 核心程式庫,請參閱遷移頁面。

  • import * as appsync from 'aws-cdk-lib/aws-appsync';:這會匯入AWS AppSync 服務

  • import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';:這會匯入 DynamoDB 服務

  • import { Construct } from 'constructs';:我們需要此項目來定義根建構

匯入的類型取決於您呼叫的服務。建議您查看CDK文件以取得範例。頁面頂端的結構描述會是CDK應用程式中作為 檔案的個別.graphql檔案。在堆疊檔案中,我們可以使用 表單將其與新的 GraphQL 建立關聯:

const add_api = new appsync.GraphqlApi(this, 'graphQL-example', { name: 'my-first-api', schema: appsync.SchemaFile.fromAsset(path.join(__dirname, 'schema.graphql')), });
注意

在範圍 中add_api,我們使用new關鍵字後面加上 API來新增 GraphQLappsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps)。我們的範圍是 this,ID CFN 是 graphQL-example,而我們的道具是 my-first-api(主控台API中的 名稱) 和 schema.graphql(結構描述檔案的絕對路徑)。

若要新增資料來源,您必須先將資料來源新增至堆疊。然後,您需要API使用來源特定方法將其與 GraphQL 建立關聯。當您建立解析器函數時,就會發生關聯。在此期間,讓我們使用範例,使用 建立 DynamoDB 資料表dynamodb.Table

const add_ddb_table = new dynamodb.Table(this, 'posts-table', { partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING, }, });
注意

如果我們在我們的範例中使用此 ID,則會新增 ID 為 CFN posts-table且分割區索引鍵為 的新 DynamoDB 資料表id (S)

接下來,我們需要在堆疊檔案中實作解析器。以下是掃描 DynamoDB 資料表中所有項目的簡單查詢範例:

const add_func = new appsync.AppsyncFunction(this, 'func-get-posts', { name: 'get_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'Scan' }; } export function response(ctx) { return ctx.result.items; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-get-posts', { add_api, typeName: 'Query', fieldName: 'getPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func], });
注意

首先,我們建立了名為 的函數add_func。此建立順序可能看起來有點反直覺,但您必須先在管道解析器中建立函數,才能建立解析器本身。函數遵循 表單:

AppsyncFunction(scope: Construct, id: string, props: AppsyncFunctionProps)

我們的範圍是 this,我們的 ID CFN 是 func-get-posts,而我們的道具包含實際的函數詳細資訊。在道具內,我們包括:

  • 主控台中將存在name的函數 AWS AppSync (get_posts_func_1)。

  • API 我們先前建立的 GraphQL (add_api)。

  • 資料來源;這是我們將資料來源連結至 GraphQL API值的點,然後連接至函數。我們會使用我們建立的資料表 (add_ddb_table),並使用其中一種GraphqlApi方法 API(add_api) 將其連接至 GraphQL ()addDynamoDbDataSource。ID 值 (table-for-posts) 是主控台中 AWS AppSync 資料來源的名稱。如需來源特定方法的清單,請參閱下列頁面:

  • 程式碼包含函數的請求和回應處理常式,這是簡單的掃描和傳回。

  • 執行期指定要使用 APPSYNC_JS 執行期 1.0.0 版。請注意,目前這是 APPSYNC_JS 唯一可用的版本。

接下來,我們需要將函數連接至管道解析程式。我們使用下列表單建立解析程式:

Resolver(scope: Construct, id: string, props: ResolverProps)

我們的範圍是 this,我們的 ID CFN 是 pipeline-resolver-get-posts,而我們的道具包含實際的函數詳細資訊。在道具中,我們包括:

  • API 我們先前建立的 GraphQL (add_api)。

  • 特殊物件類型名稱;這是一個查詢操作,因此我們只新增了值 Query

  • 欄位名稱 (getPost) 是 Query類型下結構描述中的欄位名稱。

  • 程式碼包含 處理常式之前和之後的 。我們的範例只會在函數執行其操作後傳回內容中的任何結果。

  • 執行期指定要使用 APPSYNC_JS 執行期 1.0.0 版。請注意,目前這是 APPSYNC_JS 唯一可用的版本。

  • 管道組態包含我們所建立函數的參考 (add_func)。

為了總結此範例中發生的情況,您看到了實作請求和回應處理常式的 AWS AppSync 函數。函數負責與您的資料來源互動。請求處理常式已將 Scan 操作傳送至 AWS AppSync,並指示針對 DynamoDB 資料來源執行的操作。回應處理常式傳回項目清單 (ctx.result.items)。然後項目清單會自動對應至 Post GraphQL 類型。

建立基本突變解析程式

本節將示範如何建立基本的突變解析程式。

Console
  1. 登入 AWS Management Console 並開啟AppSync主控台

    1. APIs儀表板 中,選擇您的 GraphQL API。

    2. Sidebar 中,選擇結構描述

  2. 解析程式區段和突變類型下,選擇欄位旁的連接

    注意

    在我們的範例中,我們正在連接 的解析程式createPost,將Post物件新增至資料表。假設我們使用上一節中的相同 DynamoDB 資料表。其分割區金鑰設定為 id,且為空白。

  3. 連接解析程式頁面上的解析程式類型 下,選擇 pipeline resolvers。提醒您,您可以在這裡找到有關解析程式的詳細資訊。針對 Resolver 執行期 ,選擇 APPSYNC_JS 以啟用 JavaScript 執行期。

  4. 您可以為此 啟用快取API。建議您立即關閉此功能。選擇 Create (建立)。

  5. 選擇新增函數 ,然後選擇建立新函數 。或者,您可能會看到建立函數按鈕來選擇。

    1. 選擇您的資料來源。這應該是您要使用突變操作資料的來源。

    2. 輸入 Function name

    3. 函數程式碼 下,您需要實作函數的行為。這是一個突變,因此請求最好會在調用資料來源上執行一些狀態變更操作。結果將由回應函數處理。

      注意

      createPost 正在新增或「引號」資料表Post中的新 ,並將我們的參數作為資料。我們可以新增如下內容:

      import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }

      在此步驟中,我們也新增 requestresponse函數:

      • request:請求處理常式接受內容作為引數。請求處理常式傳回陳述式會執行 PutItem命令,這是內建的 DynamoDB 操作 (如需範例,請參閱此處此處)。此PutItem命令會取得分割區key值 (由 自動產生util.autoid()) 並從內容引數輸入 attributes (這些值是我們在請求中傳遞的值),藉此將Post物件新增至 DynamoDB 資料表。keyidattributesdatetitle 欄位引數。它們都是透過util.dynamodb.toMapValues協助程式預先格式化,以使用 DynamoDB 資料表。

      • response:回應接受更新的內容,並傳回請求處理常式的結果。

    4. 完成後選擇建立

  6. 返回解析器畫面,在函數 下,選擇新增函數下拉式清單,並將函數新增至函數清單。

  7. 選擇儲存以更新解析器。

CLI

若要新增函數

  • 使用 create-function命令為您的管道解析器建立函數。

    您需要為此特定命令輸入幾個參數:

    1. api-id的 API。

    2. AWS AppSync 主控台中函數name的 。

    3. 函數將使用的資料來源名稱 data-source-name或 。必須已在 AWS AppSync 服務API中建立並連結至您的 GraphQL。

    4. 函數的 runtime、 或 環境和語言。對於 JavaScript,名稱必須為 APPSYNC_JS,執行期為 1.0.0

    5. 函數的 code、 或 請求和回應處理常式。雖然您可以手動輸入,但將其新增至 .txt 檔案 (或類似格式),再將其作為引數傳遞,會更輕鬆。

      注意

      我們的查詢程式碼將位於傳入的檔案中,作為引數:

      import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }

    範例命令可能如下所示:

    aws appsync create-function \ --api-id abcdefghijklmnopqrstuvwxyz \ --name add_posts_func_1 \ --data-source-name table-for-posts \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}

    輸出會在 中傳回CLI。範例如下:

    { "functionConfiguration": { "functionId": "vulcmbfcxffiram63psb4dduoa", "functionArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/functions/vulcmbfcxffiram63psb4dduoa", "name": "add_posts_func_1", "dataSourceName": "table-for-posts", "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output foes here" } }
    注意

    請務必在functionId某處記錄 ,因為這將用於將函數連接至解析器。

若要建立您的解析程式

  • Mutation 執行 create-resolver命令來建立 的管道函數。

    您需要為此特定命令輸入幾個參數:

    1. api-id的 API。

    2. 結構描述中的 type-name或特殊物件類型 (查詢、突變、訂閱)。

    3. field-name,或您要連接解析器之特殊物件類型的 欄位操作。

    4. kind,指定單位或管道解析程式。將此設為 PIPELINE 以啟用管道函數。

    5. 要連接至解析器的 pipeline-config、 或 (多個) 函數。請確定您知道函數functionId的值。清單的順序很重要。

    6. runtime,即 APPSYNC_JS(JavaScript)。runtimeVersion 目前為 1.0.0

    7. code,其中包含步驟前後的 。

      注意

      我們的查詢程式碼將位於傳入的檔案中,作為引數:

      import { util } from '@aws-appsync/utils'; /** * Sends a request to `put` an item in the DynamoDB data source */ export function request(ctx) { const { id, ...values } = ctx.args; return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id }), attributeValues: util.dynamodb.toMapValues(values), }; } /** * returns the result of the `put` operation */ export function response(ctx) { return ctx.result; }

    範例命令可能如下所示:

    aws appsync create-resolver \ --api-id abcdefghijklmnopqrstuvwxyz \ --type-name Mutation \ --field-name createPost \ --kind PIPELINE \ --pipeline-config functions=vulcmbfcxffiram63psb4dduoa \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0 \ --code file:///path/to/file/{filename}.{fileType}

    輸出會在 中傳回CLI。範例如下:

    { "resolver": { "typeName": "Mutation", "fieldName": "createPost", "resolverArn": "arn:aws:appsync:us-west-2:107289374856:apis/abcdefghijklmnopqrstuvwxyz/types/Mutation/resolvers/createPost", "kind": "PIPELINE", "pipelineConfig": { "functions": [ "vulcmbfcxffiram63psb4dduoa" ] }, "maxBatchSize": 0, "runtime": { "name": "APPSYNC_JS", "runtimeVersion": "1.0.0" }, "code": "Code output goes here" } }
CDK
提示

使用 之前CDK,建議您檢閱 CDK的正式文件以及 AWS AppSync的CDK參考

下列步驟只會顯示用來新增特定資源的程式碼片段的一般範例。這並非生產程式碼中的有效解決方案。我們也假設您已經有運作中的應用程式。

  • 若要產生突變,假設您在同一個專案中,您可以將其新增至堆疊檔案,例如查詢。以下是針對突變的修改函數和解析程式,該突變會將新的 新增至Post資料表:

    const add_func_2 = new appsync.AppsyncFunction(this, 'func-add-post', { name: 'add_posts_func_1', add_api, dataSource: add_api.addDynamoDbDataSource('table-for-posts-2', add_ddb_table), code: appsync.Code.fromInline(` export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({id: util.autoId()}), attributeValues: util.dynamodb.toMapValues(ctx.args.input), }; } export function response(ctx) { return ctx.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, }); new appsync.Resolver(this, 'pipeline-resolver-create-posts', { add_api, typeName: 'Mutation', fieldName: 'createPost', code: appsync.Code.fromInline(` export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; } `), runtime: appsync.FunctionRuntime.JS_1_0_0, pipelineConfig: [add_func_2], });
    注意

    由於此突變和查詢的結構類似,我們將只說明我們為了進行突變所做的變更。

    在 函數中,我們將 CFN ID 變更為 func-add-post,並將名稱變更為 add_posts_func_1 ,以反映我們將Posts新增至資料表的事實。在資料來源中,我們與 AWS AppSync 主控台中的資料表 (add_ddb_table) 建立新的關聯,table-for-posts-2因為 addDynamoDbDataSource方法需要它。請記住,此新關聯仍在使用我們先前建立的相同資料表,但我們現在在 AWS AppSync 主控台中有兩個連線:一個用於查詢,table-for-posts另一個用於突變,一個用於 table-for-posts-2。程式碼已變更為Post透過自動產生其id值並接受用戶端對其餘欄位的輸入來新增 。

    在解析程式中,我們將 ID 值變更為 pipeline-resolver-create-posts,以反映我們將Posts新增至資料表的事實。為了反映結構描述中的突變,類型名稱已變更為 Mutation,而名稱為 createPost。管道組態已設定為我們的新突變函數 add_func_2

若要摘要此範例中發生的情況, AWS AppSync 會自動將欄位中定義的引數createPost從 GraphQL 結構描述轉換為 DynamoDB 操作。此範例使用 金鑰在 DynamoDB 中存放記錄id,該金鑰是使用我們的util.autoId()協助程式自動建立的。您從 AWS AppSync 主控台或其他方式提出的請求傳遞至內容引數 (ctx.args.input) 的所有其他欄位,都會儲存為資料表的屬性。金鑰和屬性都會使用 util.dynamodb.toMapValues(values) 協助程式自動對應至相容的 DynamoDB 格式。

AWS AppSync 也支援用於編輯解析程式的測試和偵錯工作流程。您可以使用模擬context物件來查看範本的轉換值,然後再叫用它。或者,您可以在執行查詢時以互動方式檢視對資料來源的完整請求。如需詳細資訊,請參閱測試和偵錯解析器 (JavaScript)監控和記錄

進階解析程式

如果您遵循設計結構描述 中的選用分頁區段,您仍然需要將解析器新增至您的請求,才能使用分頁。我們的範例使用稱為 的查詢分頁getPosts,一次只傳回請求的部分物件。解析器在該欄位上的程式碼看起來可能如下所示:

/** * Performs a scan on the dynamodb data source */ export function request(ctx) { const { limit = 20, nextToken } = ctx.args; return { operation: 'Scan', limit, nextToken }; } /** * @returns the result of the `put` operation */ export function response(ctx) { const { items: posts = [], nextToken } = ctx.result; return { posts, nextToken }; }

在請求中,我們會傳遞請求的內容。我們的 limit20,這表示我們在第一個查詢Posts中傳回最多 20 個。我們的nextToken游標會固定在資料來源的第一個Post項目。這些會傳遞給 args。然後,請求會執行從第一個Post到掃描限制編號的掃描。資料來源會將結果存放在內容中,並傳遞給回應。回應會傳回Posts其擷取的 ,然後將 nextToken 設定為限制之後的 Post項目。下一個請求會發出以執行完全相同的作業,但在第一次查詢後立即從偏移開始。請記住,這些類型的請求是依序完成的,而不是平行的。