Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
AWS AppSync JavaScript referensi objek konteks resolver
AWS AppSync mendefinisikan satu set variabel dan fungsi untuk bekerja dengan permintaan dan penangan respon. Ini membuat operasi logis pada data lebih mudah dengan GraphQL. Dokumen ini menjelaskan fungsi-fungsi tersebut dan memberikan contoh.
Mengakses context
context
Argumen penangan permintaan dan respons adalah objek yang menyimpan semua informasi kontekstual untuk pemanggilan resolver Anda. Ini memiliki struktur sebagai berikut:
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; };
catatan
Anda akan sering menemukan bahwa context
objek tersebut disebut sebagaictx
.
Setiap bidang dalam context
objek didefinisikan sebagai berikut:
context
bidang
-
arguments
-
Peta yang berisi semua argumen GraphQL untuk bidang ini.
-
identity
-
Objek yang berisi informasi tentang penelepon. Untuk informasi selengkapnya tentang struktur bidang ini, lihat Identitas.
-
source
-
Peta yang berisi resolusi bidang induk.
-
stash
-
Stash adalah objek yang tersedia di dalam setiap resolver dan function handler. Objek simpanan yang sama hidup melalui satu resolver run. Ini berarti Anda dapat menggunakan stash untuk meneruskan data arbitrer di seluruh penangan permintaan dan respons dan di seluruh fungsi dalam resolver pipeline.
catatan
Anda tidak dapat menghapus atau mengganti seluruh simpanan, tetapi Anda dapat menambahkan, memperbarui, menghapus, dan membaca properti simpanan.
Anda dapat menambahkan item ke simpanan dengan memodifikasi salah satu contoh kode di bawah ini:
//Example 1 ctx.stash.newItem = { key: "something" } //Example 2 Object.assign(ctx.stash, {key1: value1, key2: value})
Anda dapat menghapus item dari simpanan dengan memodifikasi kode di bawah ini:
delete ctx.stash.key
-
result
-
Wadah untuk hasil resolver ini. Bidang ini hanya tersedia untuk penangan respons.
Misalnya, jika Anda menyelesaikan
author
bidang kueri berikut:query { getPost(id: 1234) { postId title content author { id name } } }
Kemudian
context
variabel lengkap tersedia ketika penangan respons dievaluasi:{ "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
-
Hasil dari operasi apa pun sebelumnya dieksekusi dalam resolver pipa.
Jika operasi sebelumnya adalah penangan permintaan penyelesai pipa, maka
ctx.prev.result
mewakili hasil evaluasi tersebut dan tersedia untuk fungsi pertama dalam pipeline.Jika operasi sebelumnya adalah fungsi pertama, maka
ctx.prev.result
merupakan hasil evaluasi dari handler respons fungsi pertama dan tersedia untuk fungsi kedua dalam pipeline.Jika operasi sebelumnya adalah fungsi terakhir, maka
ctx.prev.result
mewakili hasil evaluasi dari fungsi terakhir dan tersedia untuk pengendali respons penyelesai pipa. -
info
-
Objek yang berisi informasi tentang permintaan GraphQL. Untuk struktur bidang ini, lihat Info.
Identitas
identity
Bagian ini berisi informasi tentang penelepon. Bentuk bagian ini tergantung pada jenis otorisasi Anda AWS AppSync API.
Untuk informasi selengkapnya tentang opsi AWS AppSync keamanan, lihat Otorisasi dan otentikasi.
-
API_KEY
otorisasi -
identity
Bidang tidak dihuni. AWS_LAMBDA
otorisasi-
Ini
identity
memiliki bentuk sebagai berikut:type AppSyncIdentityLambda = { resolverContext: any; };
Berisi
resolverContext
kunci,identity
berisiresolverContext
konten yang sama yang dikembalikan oleh fungsi Lambda yang mengotorisasi permintaan. -
AWS_IAM
otorisasi -
Ini
identity
memiliki bentuk sebagai berikut:type AppSyncIdentityIAM = { accountId: string; cognitoIdentityPoolId: string; cognitoIdentityId: string; sourceIp: string[]; username: string; userArn: string; cognitoIdentityAuthType: string; cognitoIdentityAuthProvider: string; };
-
AMAZON_COGNITO_USER_POOLS
otorisasi -
Ini
identity
memiliki bentuk sebagai berikut:type AppSyncIdentityCognito = { sourceIp: string[]; username: string; groups: string[] | null; sub: string; issuer: string; claims: any; defaultAuthStrategy: string; };
Setiap bidang didefinisikan sebagai berikut:
-
accountId
-
ID AWS akun penelepon.
-
claims
-
Klaim yang dimiliki pengguna.
-
cognitoIdentityAuthType
-
Entah diautentikasi atau tidak diautentikasi berdasarkan tipe identitas.
-
cognitoIdentityAuthProvider
-
Daftar informasi penyedia identitas eksternal yang dipisahkan koma yang digunakan dalam memperoleh kredensil yang digunakan untuk menandatangani permintaan.
-
cognitoIdentityId
-
ID identitas Amazon Cognito dari penelepon.
-
cognitoIdentityPoolId
-
ID kumpulan identitas Amazon Cognito yang terkait dengan pemanggil.
-
defaultAuthStrategy
-
Strategi otorisasi default untuk penelepon ini (
ALLOW
atauDENY
). -
issuer
-
Penerbit token.
-
sourceIp
-
Alamat IP sumber penelepon yang AWS AppSync menerima. Jika permintaan tidak menyertakan
x-forwarded-for
header, nilai IP sumber hanya berisi satu alamat IP dari TCP koneksi. Jika permintaan menyertakanx-forwarded-for
header, IP sumber adalah daftar alamat IP darix-forwarded-for
header, selain alamat IP dari TCP koneksi. -
sub
-
Dari pengguna UUID yang diautentikasi.
-
user
-
IAMPengguna.
-
userArn
-
Nama Sumber Daya Amazon (ARN) IAM pengguna.
-
username
-
Nama pengguna dari pengguna yang diautentikasi. Dalam hal
AMAZON_COGNITO_USER_POOLS
otorisasi, nilai nama pengguna adalah nilai atribut cognito:username. Dalam halAWS_IAM
otorisasi, nilai nama pengguna adalah nilai prinsipal AWS pengguna. Jika Anda menggunakan IAM otorisasi dengan kredensi yang dijual dari kumpulan identitas Amazon Cognito, kami sarankan Anda menggunakannya.cognitoIdentityId
Akses header permintaan
AWS AppSync mendukung meneruskan header khusus dari klien dan mengaksesnya di resolver GraphQL Anda dengan menggunakan. ctx.request.headers
Anda kemudian dapat menggunakan nilai header untuk tindakan seperti memasukkan data ke sumber data atau pemeriksaan otorisasi. Anda dapat menggunakan header permintaan tunggal atau beberapa menggunakan $curl
dengan API kunci dari baris perintah, seperti yang ditunjukkan dalam contoh berikut:
Contoh header tunggal
Misalkan Anda menetapkan header custom
dengan nilai nadia
seperti berikut:
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
Ini kemudian dapat diakses denganctx.request.headers.custom
. Misalnya, mungkin dalam kode berikut untuk DynamoDB:
"custom": util.dynamodb.toDynamoDB(ctx.request.headers.custom)
Beberapa contoh header
Anda juga dapat meneruskan beberapa header dalam satu permintaan dan mengaksesnya di penangan resolver. Misalnya, jika custom
header diatur dengan dua nilai:
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
Anda kemudian dapat mengakses ini sebagai array, sepertictx.request.headers.custom[1]
.
catatan
AWS AppSync tidak mengekspos header cookie dictx.request.headers
.
Mengakses permintaan nama domain kustom
AWS AppSync mendukung konfigurasi domain kustom yang dapat Anda gunakan untuk mengakses GraphQL Anda dan titik akhir real-time untuk Anda. APIs Saat membuat permintaan dengan nama domain khusus, Anda bisa mendapatkan nama domain menggunakanctx.request.domainName
.
Saat menggunakan nama domain titik akhir GraphQL default, nilainya adalah. null
Info
info
Bagian ini berisi informasi tentang permintaan GraphQL. Bagian ini memiliki bentuk sebagai berikut:
type Info = { fieldName: string; parentTypeName: string; variables: any; selectionSetList: string[]; selectionSetGraphQL: string; };
Setiap bidang didefinisikan sebagai berikut:
-
fieldName
-
Nama bidang yang saat ini sedang diselesaikan.
-
parentTypeName
-
Nama tipe induk untuk bidang yang saat ini sedang diselesaikan.
-
variables
-
Peta yang menampung semua variabel yang diteruskan ke permintaan GraphQL.
-
selectionSetList
-
Sebuah daftar representasi bidang dalam set pilihan GraphQL. Bidang yang dialias hanya direferensikan dengan nama alias, bukan nama bidang. Contoh berikut menunjukkan ini secara rinci.
-
selectionSetGraphQL
-
Sebuah representasi string dari set seleksi, diformat sebagai GraphQL skema definisi bahasa (). SDL Meskipun fragmen tidak digabungkan ke dalam kumpulan seleksi, fragmen sebaris dipertahankan, seperti yang ditunjukkan pada contoh berikut.
catatan
JSON.stringify
tidak akan menyertakan selectionSetGraphQL
dan selectionSetList
dalam serialisasi string. Anda harus mereferensikan properti ini secara langsung.
Misalnya, jika Anda menyelesaikan getPost
bidang kueri berikut:
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 } }
Kemudian ctx.info
variabel lengkap yang tersedia saat memproses handler mungkin:
{ "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
mengekspos hanya bidang yang termasuk dalam tipe saat ini. Jika tipe saat ini adalah antarmuka atau gabungan, hanya bidang yang dipilih milik antarmuka yang diekspos. Misalnya, diberikan skema berikut:
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 }
Dan query berikut:
query { node(id: "post1") { id ... on Post { title } ... on Blog { title } } }
Saat memanggil ctx.info.selectionSetList
pada resolusi Query.node
bidang, hanya yang id
diekspos:
"selectionSetList": [ "id" ]