本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立基本查詢 (JavaScript)
GraphQL 解析程式將類型結構描述中的欄位連接到資料來源。解析程式是滿足請求的機制。
解析程式 AWS AppSync 用來 JavaScript 將 GraphQL 表達式轉換為資料來源可以使用的格式。或者,映射範本可以用 Apache Velocity 範本語言 (VTL)
本節說明如何使用 設定解析器 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
-
-
登入 AWS Management Console 並開啟AppSync主控台
。 -
在APIs儀表板 中,選擇您的 GraphQL API。
-
在 Sidebar 中,選擇結構描述 。
-
-
在結構描述編輯器旁邊,有一個名為解析程式 的視窗。此方塊包含結構描述視窗中定義的類型和欄位清單。您可以將解析器連接至 欄位。您很可能將解析器連接至您的欄位操作。在本節中,我們將探討簡單的查詢組態。在查詢類型下,選擇查詢欄位旁的連接。
-
在連接解析程式頁面的解析程式類型 下,您可以選擇管道或單位解析程式。如需這些類型的詳細資訊,請參閱解析程式 。本指南將使用
pipeline resolvers
。提示
建立管道解析程式時,您的資料來源會連接至管道函數 (s)。函數會在您建立管道解析程式本身之後建立,因此此頁面中沒有設定函數的選項。如果您使用的是單位解析器,則資料來源會直接與解析器綁定,因此您會在此頁面中設定。
針對 Resolver 執行期 ,選擇
APPSYNC_JS
以啟用 JavaScript 執行期。 -
您可以為此 啟用快取API。建議您立即關閉此功能。選擇 Create (建立)。
-
在編輯解析程式頁面上,有一個名為解析程式程式碼的程式碼編輯器,可讓您實作解析程式處理程式和回應的邏輯 (步驟前後)。如需詳細資訊,請參閱JavaScript解析程式概觀 。
注意
在我們的範例中,我們只會將請求和回應集保留空白,以傳回內容 中的最後一個資料來源結果:
import {util} from '@aws-appsync/utils'; export function request(ctx) { return {}; } export function response(ctx) { return ctx.prev.result; }
本節下方有一個名為 Functions 的資料表。函數可讓您實作可在多個解析器間重複使用的程式碼。您可以將原始程式碼儲存為可在需要時新增至解析器的函數,而不是不斷重寫或複製程式碼。
函數構成管道操作清單的大量。在解析器中使用多個函數時,您可以設定函數的順序,並將按該順序執行。它們會在請求函數執行之後,以及回應函數開始之前執行。
若要新增函數,請在函數 下,選擇新增函數 ,然後選擇建立新函數 。或者,您可能會看到建立函數按鈕來選擇。
-
選擇資料來源。這將是解析程式在其上執行動作的資料來源。
注意
在我們的範例中,我們正在連接 的解析器
getPost
,該解析器會藉由 擷取Post
物件id
。假設我們已經為此結構描述設定 DynamoDB 資料表。其分割區金鑰設定為id
,且為空白。 -
輸入
Function name
。 -
在函數程式碼 下,您需要實作函數的行為。這可能令人困惑,但每個函數都會有自己的本機請求和回應處理常式。執行請求,然後進行資料來源調用來處理請求,然後由回應處理常式處理資料來源回應。結果會儲存在內容物件中。之後,清單中的下一個函數會執行,如果是最後一個函數,則會傳遞給步驟後回應處理常式。
注意
在我們的範例中,我們會將解析器連接至
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
是指管道中的上一個操作,也就是我們的request
。result
包含解析器在管道中移動時的結果 (s)。如果您將所有操作整合在一起,ctx.prev.result
會傳回上次執行的操作結果,也就是請求處理常式。
-
-
完成後選擇建立。
-
-
返回解析器畫面,在函數 下,選擇新增函數下拉式清單,並將函數新增至函數清單。
-
選擇儲存以更新解析程式。
-
- CLI
-
若要新增函數
-
使用
create-function
命令為您的管道解析器建立函數。您需要為此特定命令輸入幾個參數:
-
您
api-id
的 API。 -
AWS AppSync 主控台中函數
name
的 。 -
函數將使用的資料來源名稱
data-source-name
或 。必須已在 AWS AppSync 服務API中建立並連結至您的 GraphQL。 -
函數的
runtime
、 或 環境和語言。對於 JavaScript,名稱必須為APPSYNC_JS
,執行期為1.0.0
。 -
函數的
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
命令來建立 的管道函數。您需要為此特定命令輸入幾個參數:
-
您
api-id
的 API。 -
結構描述中的
type-name
或特殊物件類型 (查詢、突變、訂閱)。 -
field-name
,或您要連接解析器之特殊物件類型內的欄位操作。 -
kind
,指定單位或管道解析器。將此設定為PIPELINE
以啟用管道函數。 -
要連接至解析器的
pipeline-config
、 或 (多個) 函數。請務必了解函數functionId
的值。清單的順序很重要。 -
runtime
,即APPSYNC_JS
(JavaScript)。runtimeVersion
目前為1.0.0
。 -
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
-
提示
基本應用程式將需要下列項目:
-
服務匯入指令
-
結構描述程式碼
-
資料來源產生器
-
函數程式碼
-
解析程式程式碼
從設計結構描述和連接資料來源區段中,我們知道堆疊檔案將包含 表單的匯入指令:
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
-
-
登入 AWS Management Console 並開啟AppSync主控台
。 -
在APIs儀表板 中,選擇您的 GraphQL API。
-
在 Sidebar 中,選擇結構描述 。
-
-
在解析程式區段和突變類型下,選擇欄位旁的連接。
注意
在我們的範例中,我們正在連接 的解析程式
createPost
,將Post
物件新增至資料表。假設我們使用上一節中的相同 DynamoDB 資料表。其分割區金鑰設定為id
,且為空白。 -
在連接解析程式頁面上的解析程式類型 下,選擇
pipeline resolvers
。提醒您,您可以在這裡找到有關解析程式的詳細資訊。針對 Resolver 執行期 ,選擇APPSYNC_JS
以啟用 JavaScript 執行期。 -
您可以為此 啟用快取API。建議您立即關閉此功能。選擇 Create (建立)。
-
選擇新增函數 ,然後選擇建立新函數 。或者,您可能會看到建立函數按鈕來選擇。
-
選擇您的資料來源。這應該是您要使用突變操作資料的來源。
-
輸入
Function name
。 -
在函數程式碼 下,您需要實作函數的行為。這是一個突變,因此請求最好會在調用資料來源上執行一些狀態變更操作。結果將由回應函數處理。
注意
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; }
在此步驟中,我們也新增
request
和response
函數:-
request
:請求處理常式接受內容作為引數。請求處理常式傳回陳述式會執行PutItem
命令,這是內建的 DynamoDB 操作 (如需範例,請參閱此處或此處)。此PutItem
命令會取得分割區key
值 (由 自動產生util.autoid()
) 並從內容引數輸入attributes
(這些值是我們在請求中傳遞的值),藉此將Post
物件新增至 DynamoDB 資料表。key
是id
和attributes
是date
和title
欄位引數。它們都是透過util.dynamodb.toMapValues
協助程式預先格式化,以使用 DynamoDB 資料表。 -
response
:回應接受更新的內容,並傳回請求處理常式的結果。
-
-
完成後選擇建立。
-
-
返回解析器畫面,在函數 下,選擇新增函數下拉式清單,並將函數新增至函數清單。
-
選擇儲存以更新解析器。
-
- CLI
-
若要新增函數
-
使用
create-function
命令為您的管道解析器建立函數。您需要為此特定命令輸入幾個參數:
-
您
api-id
的 API。 -
AWS AppSync 主控台中函數
name
的 。 -
函數將使用的資料來源名稱
data-source-name
或 。必須已在 AWS AppSync 服務API中建立並連結至您的 GraphQL。 -
函數的
runtime
、 或 環境和語言。對於 JavaScript,名稱必須為APPSYNC_JS
,執行期為1.0.0
。 -
函數的
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
命令來建立 的管道函數。您需要為此特定命令輸入幾個參數:
-
您
api-id
的 API。 -
結構描述中的
type-name
或特殊物件類型 (查詢、突變、訂閱)。 -
field-name
,或您要連接解析器之特殊物件類型的 欄位操作。 -
kind
,指定單位或管道解析程式。將此設為PIPELINE
以啟用管道函數。 -
要連接至解析器的
pipeline-config
、 或 (多個) 函數。請確定您知道函數functionId
的值。清單的順序很重要。 -
runtime
,即APPSYNC_JS
(JavaScript)。runtimeVersion
目前為1.0.0
。 -
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
-
提示
-
若要產生突變,假設您在同一個專案中,您可以將其新增至堆疊檔案,例如查詢。以下是針對突變的修改函數和解析程式,該突變會將新的 新增至
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 }; }
在請求中,我們會傳遞請求的內容。我們的 limit
是 20
,這表示我們在第一個查詢Posts
中傳回最多 20 個。我們的nextToken
游標會固定在資料來源的第一個Post
項目。這些會傳遞給 args。然後,請求會執行從第一個Post
到掃描限制編號的掃描。資料來源會將結果存放在內容中,並傳遞給回應。回應會傳回Posts
其擷取的 ,然後將 nextToken
設定為限制之後的 Post
項目。下一個請求會發出以執行完全相同的作業,但在第一次查詢後立即從偏移開始。請記住,這些類型的請求是依序完成的,而不是平行的。