AWS AppSync JavaScript 解析器內容物件參考 - AWS AppSync

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

AWS AppSync JavaScript 解析器內容物件參考

AWS AppSync 定義一組變數和函數,用於使用請求和回應處理常式。這樣可讓使用 GraphQL 對資料進行邏輯運算更簡單。本文件說明這些函數並提供範例。

正在存取 context

請求和回應處理常式的context引數是物件,可保留解析程式調用的所有內容資訊。其結構如下:

type Context = { arguments: any; args: any; identity: Identity; source: any; error?: { message: string; type: string; }; stash: any; result: any; prev: any; request: Request; info: Info; };
注意

您通常會發現context物件稱為 ctx

context 物件中的每個欄位定義如下:

context 欄位

arguments

包含此欄位所有 GraphQL 引數的映射。

identity

包含有關發起人資訊的物件。如需此欄位結構的詳細資訊,請參閱身分

source

包含父欄位解析度的映射。

stash

堆疊是在每個解析器和函數處理常式內提供的物件。相同的堆疊物件透過單一解析器執行來存留。這表示您可以使用 stash 跨請求和回應處理常式,以及管道解析程式中的函數傳遞任意資料。

注意

您無法刪除或取代整個堆疊,但您可以新增、更新、刪除和讀取堆疊的屬性。

您可以修改下列其中一個程式碼範例,將項目新增至存放區:

//Example 1 ctx.stash.newItem = { key: "something" } //Example 2 Object.assign(ctx.stash, {key1: value1, key2: value})

您可以修改下列程式碼,從存放區移除項目:

delete ctx.stash.key
result

此解析程式結果的容器。此欄位僅適用於回應處理常式。

例如,如果您正在解決下列查詢author的欄位:

query { getPost(id: 1234) { postId title content author { id name } } }

然後,評估回應處理常式時,即可使用完整context變數:

{ "arguments" : { id: "1234" }, "source": {}, "result" : { "postId": "1234", "title": "Some title", "content": "Some content", "author": { "id": "5678", "name": "Author Name" } }, "identity" : { "sourceIp" : ["x.x.x.x"], "userArn" : "arn:aws:iam::123456789012:user/appsync", "accountId" : "666666666666", "user" : "AIDAAAAAAAAAAAAAAAAAA" } }
prev.result

在管道解析程式中執行任何先前操作的結果。

如果先前的操作是管道解析程式的請求處理常式,則 ctx.prev.result會代表該評估結果,並提供給管道中的第一個函數。

如果先前的操作是第一個函數,則 ctx.prev.result代表第一個函數回應處理常式的評估結果,並提供給管道中的第二個函數。

如果先前的操作是最後一個函數,則 ctx.prev.result代表最後一個函數的評估結果,並提供給管道解析器的回應處理常式。

info

包含有關 GraphQL 請求資訊的物件。如需此欄位的結構,請參閱資訊

Identity

包含有關發起人資訊的 identity 區段。本節的形狀取決於 的授權類型 AWS AppSync API。

如需 AWS AppSync 安全選項的詳細資訊,請參閱授權和身分驗證。

API_KEY 授權

identity 欄位未填入。

AWS_LAMBDA 授權

identity 具有下列表單:

type AppSyncIdentityLambda = { resolverContext: any; };

identity 包含 resolverContext金鑰,其中包含由 Lambda 函數傳回的相同resolverContext內容,以授權請求。

AWS_IAM 授權

identity 具有下列表單:

type AppSyncIdentityIAM = { accountId: string; cognitoIdentityPoolId: string; cognitoIdentityId: string; sourceIp: string[]; username: string; userArn: string; cognitoIdentityAuthType: string; cognitoIdentityAuthProvider: string; };
AMAZON_COGNITO_USER_POOLS 授權

identity 具有下列表單:

type AppSyncIdentityCognito = { sourceIp: string[]; username: string; groups: string[] | null; sub: string; issuer: string; claims: any; defaultAuthStrategy: string; };

每個欄位的定義如下:

accountId

來電者 AWS 的帳戶 ID。

claims

使用者擁有的宣告。

cognitoIdentityAuthType

經身分驗證或未經身分驗證 (根據身分類型)。

cognitoIdentityAuthProvider

以逗號分隔的外部身分提供者資訊清單,用於取得用來簽署請求的憑證。

cognitoIdentityId

來電者的 Amazon Cognito 身分 ID。

cognitoIdentityPoolId

與呼叫者相關聯的 Amazon Cognito 身分集區 ID。

defaultAuthStrategy

此發起人 (ALLOWDENY) 的預設授權策略。

issuer

字符發行者。

sourceIp

AWS AppSync 接收呼叫者的來源 IP 地址。如果請求不包含x-forwarded-for標頭,來源 IP 值只會包含來自TCP連線的單一 IP 地址。如果請求包含x-forwarded-for標頭,則除了TCP連線的 IP 地址之外,來源 IP 也是來自x-forwarded-for標頭的 IP 地址清單。

sub

已UUID驗證使用者的 。

user

IAM 使用者。

userArn

IAM 使用者的 Amazon Resource Name (ARN)。

username

已驗證使用者的使用者名稱。如果是 AMAZON_COGNITO_USER_POOLS 授權,使用者名稱的值是屬性 cognito:username 的值。在AWS_IAM授權的情況下,使用者名稱的值是 AWS 使用者主體的值。如果您使用IAM來自 Amazon Cognito 身分集區的憑證授權,建議您使用 cognitoIdentityId

存取請求標頭

AWS AppSync 支援從用戶端傳遞自訂標頭,並使用 存取 GraphQL 解析程式中的這些標頭ctx.request.headers。然後,您可以將標頭值用於將資料插入資料來源或授權檢查等動作。您可以使用 $curl搭配來自命令列的 API金鑰來使用單一或多個請求標頭,如下列範例所示:

單一標頭範例

假設您設定使用 custom 值的 nadia 標頭,如下所示:

curl -XPOST -H "Content-Type:application/graphql" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql

可使用 ctx.request.headers.custom 對此進行存取。例如,它可能位於 DynamoDB 的下列程式碼中:

"custom": util.dynamodb.toDynamoDB(ctx.request.headers.custom)

多個標頭範例

您也可以在單一請求中傳遞多個標頭,並在解析程式處理常式中存取這些標頭。例如,如果custom標頭設定為兩個值:

curl -XPOST -H "Content-Type:application/graphql" -H "custom:bailey" -H "custom:nadia" -H "x-api-key:<API-KEY-VALUE>" -d '{"query":"mutation { createEvent(name: \"demo\", when: \"Next Friday!\", where: \"Here!\") {id name when where description}}"}' https://<ENDPOINT>/graphql

然後,您可以將這些存取為陣列,例如 ctx.request.headers.custom[1]

注意

AWS AppSync 不會在 中公開 Cookie 標頭ctx.request.headers

存取請求自訂網域名稱

AWS AppSync 支援設定自訂網域,您可以使用該網域來存取 GraphQL 和 的即時端點APIs。使用自訂網域名稱提出請求時,您可以使用 取得網域名稱ctx.request.domainName

使用預設 GraphQL 端點網域名稱時,值為 null

Info

info 區段包含有關 GraphQL 請求的資訊。本節包含下列表單:

type Info = { fieldName: string; parentTypeName: string; variables: any; selectionSetList: string[]; selectionSetGraphQL: string; };

每個欄位的定義如下:

fieldName

目前正在解析的欄位名稱。

parentTypeName

目前正在解析的欄位父類型名稱。

variables

包含傳遞給 GraphQL 請求之所有變數的映射。

selectionSetList

此清單表示 GraphQL 選取範圍中的欄位。別名的欄位僅由別名名稱參考,而非欄位名稱。以下範例詳細說明這一點。

selectionSetGraphQL

選取集的字串表示法,格式為 GraphQL 結構描述定義語言 (SDL)。雖然片段不會合併至選取集,但會保留內嵌片段,如下列範例所示。

注意

JSON.stringify 不會在字串序列化selectionSetList中包含 selectionSetGraphQL和 。您必須直接參考這些屬性。

例如,如果您解析下列查詢的 getPost 欄位:

query { getPost(id: $postId) { postId title secondTitle: title content author(id: $authorId) { authorId name } secondAuthor(id: "789") { authorId } ... on Post { inlineFrag: comments: { id } } ... postFrag } } fragment postFrag on Post { postFrag: comments: { id } }

然後,處理處理常式時可用的完整ctx.info變數可能是:

{ "fieldName": "getPost", "parentTypeName": "Query", "variables": { "postId": "123", "authorId": "456" }, "selectionSetList": [ "postId", "title", "secondTitle" "content", "author", "author/authorId", "author/name", "secondAuthor", "secondAuthor/authorId", "inlineFragComments", "inlineFragComments/id", "postFragComments", "postFragComments/id" ], "selectionSetGraphQL": "{\n getPost(id: $postId) {\n postId\n title\n secondTitle: title\n content\n author(id: $authorId) {\n authorId\n name\n }\n secondAuthor(id: \"789\") {\n authorId\n }\n ... on Post {\n inlineFrag: comments {\n id\n }\n }\n ... postFrag\n }\n}" }

selectionSetList 只會公開屬於目前類型的欄位。如果目前類型是介面或聯合,則只會公開屬於介面的所選欄位。例如,提供下列結構描述:

type Query { node(id: ID!): Node } interface Node { id: ID } type Post implements Node { id: ID title: String author: String } type Blog implements Node { id: ID title: String category: String }

以及下列查詢:

query { node(id: "post1") { id ... on Post { title } ... on Blog { title } } }

ctx.info.selectionSetListQuery.node欄位解析度呼叫 時,只會id公開:

"selectionSetList": [ "id" ]