View a markdown version of this page

Membuat kueri dasar (JavaScript) - AWS AppSync GraphQL

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Membuat kueri dasar (JavaScript)

Resolver GraphQL menghubungkan bidang dalam skema tipe ke sumber data. Resolver adalah mekanisme dimana permintaan dipenuhi.

Resolver AWS AppSync digunakan JavaScript untuk mengonversi ekspresi GraphQL ke dalam format yang dapat digunakan sumber data. Atau, template pemetaan dapat ditulis dalam Apache Velocity Template Language (VTL) untuk mengubah ekspresi GraphQL menjadi format yang dapat digunakan sumber data.

Bagian ini menjelaskan cara mengkonfigurasi resolver menggunakan JavaScript. Bagian Tutorial Resolver (JavaScript) menyediakan tutorial mendalam tentang cara mengimplementasikan resolver menggunakan. JavaScript Bagian Resolver reference (JavaScript) memberikan penjelasan tentang operasi utilitas yang dapat digunakan dengan JavaScript resolver.

Kami merekomendasikan mengikuti panduan ini sebelum mencoba menggunakan salah satu tutorial yang disebutkan di atas.

Pada bagian ini, kita akan membahas cara membuat dan mengkonfigurasi resolver untuk kueri dan mutasi.

catatan

Panduan ini mengasumsikan Anda telah membuat skema dan memiliki setidaknya satu kueri atau mutasi. Jika Anda mencari langganan (data real-time), lihat panduan ini.

Pada bagian ini, kami akan memberikan beberapa langkah umum untuk mengkonfigurasi resolver bersama dengan contoh yang menggunakan skema di bawah ini:

// 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] }

Membuat penyelesai kueri dasar

Bagian ini akan menunjukkan kepada Anda cara membuat resolver kueri dasar.

Console
  1. Masuk ke Konsol Manajemen AWS dan buka AppSync konsol.

    1. Di dasbor API, pilih GraphQL API Anda.

    2. Di Sidebar, pilih Skema.

  2. Masukkan detail skema dan sumber data Anda. Lihat bagian Mer ancang skema Anda dan Melampirkan sumber data untuk informasi selengkapnya.

  3. Di sebelah editor Skema, Ada jendela bernama Resolvers. Kotak ini berisi daftar jenis dan bidang seperti yang didefinisikan di jendela Skema Anda. Anda dapat melampirkan resolver ke bidang. Anda kemungkinan besar akan melampirkan resolver ke operasi lapangan Anda. Pada bagian ini, kita akan melihat konfigurasi query sederhana. Di bawah jenis kueri, pilih Lampirkan di sebelah bidang kueri Anda.

  4. Pada halaman Lamp irkan resolver, di bawah jenis Resolver, Anda dapat memilih antara pipeline atau unit resolver. Untuk informasi selengkapnya tentang jenis ini, lihat Resolver. Panduan ini akan memanfaatkanpipeline resolvers.

    Tip

    Saat membuat resolver pipeline, sumber data Anda akan dilampirkan ke fungsi pipeline. Fungsi dibuat setelah Anda membuat resolver pipeline itu sendiri, itulah sebabnya tidak ada opsi untuk mengaturnya di halaman ini. Jika Anda menggunakan unit resolver, sumber data terikat langsung ke resolver, jadi Anda akan mengaturnya di halaman ini.

    Untuk runtime Resolver, pilih APPSYNC_JS untuk mengaktifkan JavaScript runtime.

  5. Anda dapat mengaktifkan caching untuk API ini. Sebaiknya matikan fitur ini untuk saat ini. Pilih Buat.

  6. Pada halaman Edit resolver, ada editor kode yang disebut kode Resolver yang memungkinkan Anda mengimplementasikan logika untuk pengendali resolver dan respons (sebelum dan sesudah langkah). Untuk informasi selengkapnya, lihat ikhtis JavaScript ar resolver.

    catatan

    Dalam contoh kita, kita hanya akan membiarkan permintaan kosong dan respons diatur untuk mengembalikan hasil sumber data terakhir dari konteks:

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

    Di bawah bagian ini, ada tabel yang disebut Functions. Fungsi memungkinkan Anda untuk mengimplementasikan kode yang dapat digunakan kembali di beberapa resolver. Alih-alih terus-menerus menulis ulang atau menyalin kode, Anda dapat menyimpan kode sumber sebagai fungsi untuk ditambahkan ke resolver kapan pun Anda membutuhkannya.

    Fungsi membentuk sebagian besar daftar operasi pipa. Saat menggunakan beberapa fungsi dalam resolver, Anda mengatur urutan fungsi, dan mereka akan dijalankan dalam urutan itu secara berurutan. Mereka dieksekusi setelah fungsi permintaan berjalan dan sebelum fungsi respons dimulai.

    Untuk menambahkan fungsi baru, di bawah Fungsi, pilih Tam bah fungsi, lalu Buat fungsi baru. Atau, Anda mungkin melihat tombol Buat fungsi untuk memilih sebagai gantinya.

    1. Pilih sumber data. Ini akan menjadi sumber data tempat resolver bertindak.

      catatan

      Dalam contoh kita, kita melampirkan resolver untukgetPost, yang mengambil Post objek oleh. id Mari kita asumsikan kita sudah menyiapkan tabel DynamoDB untuk skema ini. Kunci partisinya diatur ke id dan kosong.

    2. Masukkan aFunction name.

    3. Di bawah kode fungsi, Anda harus mengimplementasikan perilaku fungsi. Ini mungkin membingungkan, tetapi setiap fungsi akan memiliki permintaan lokal dan handler respons. Permintaan berjalan, kemudian pemanggilan sumber data dibuat untuk menangani permintaan, kemudian respons sumber data diproses oleh pengendali respons. Hasilnya disimpan dalam objek konteks. Setelah itu, fungsi berikutnya dalam daftar akan berjalan atau akan diteruskan ke handler respons setelah langkah jika itu yang terakhir.

      catatan

      Dalam contoh kita, kita melampirkan resolver kegetPost, yang mendapatkan daftar Post objek dari sumber data. Fungsi permintaan kami akan meminta data dari tabel kami, tabel akan meneruskan responsnya ke konteks (ctx), kemudian respons akan mengembalikan hasilnya dalam konteks. AWS AppSync Kekuatan terletak pada keterhubungannya dengan layanan lain. AWS Karena kami menggunakan DynamoDB, kami memiliki serangkaian operasi untuk menyederhanakan hal-hal seperti ini. Kami memiliki beberapa contoh boilerplate untuk jenis sumber data lainnya juga.

      Kode kami akan terlihat seperti ini:

      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; }

      Pada langkah ini, kami menambahkan dua fungsi:

      • request: Penangan permintaan melakukan operasi pengambilan terhadap sumber data. Argumen berisi objek konteks (ctx), atau beberapa data yang tersedia untuk semua resolver yang melakukan operasi tertentu. Misalnya, mungkin berisi data otorisasi, nama bidang yang diselesaikan, dll. Pernyataan pengembalian melakukan Scan operasi (lihat di sini untuk contoh). Karena kami bekerja dengan DynamoDB, kami diizinkan untuk menggunakan beberapa operasi dari layanan itu. Pemindaian melakukan pengambilan dasar dari semua item di tabel kami. Hasil operasi ini disimpan dalam objek konteks sebagai result wadah sebelum diteruskan ke pengendali respons. Ini request dijalankan sebelum respon dalam pipa.

      • response: Penangan respons yang mengembalikan output darirequest. Argumen adalah objek konteks yang diperbarui, dan pernyataan pengembalian adalahctx.prev.result. Pada titik ini dalam panduan, Anda mungkin tidak terbiasa dengan nilai ini. ctxmengacu pada objek konteks. prevmengacu pada operasi sebelumnya dalam pipa, yang merupakan milik kamirequest. resultBerisi hasil resolver saat bergerak melalui pipa. Jika Anda menyatukan semuanya, ctx.prev.result adalah mengembalikan hasil operasi terakhir yang dilakukan, yang merupakan pengendali permintaan.

    4. Pilih Buat setelah Anda selesai.

  7. Kembali ke layar resolver, di bawah Fungsi, pilih drop-down Tambahkan fungsi dan tambahkan fungsi Anda ke daftar fungsi Anda.

  8. Pilih Simpan untuk memperbarui resolver.

CLI

Untuk menambahkan fungsi Anda

  • Buat fungsi untuk resolver pipeline Anda menggunakan create-function perintah.

    Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

    1. api-iddari API Anda.

    2. nameFungsi di AWS AppSync konsol.

    3. data-source-name, atau nama sumber data yang akan digunakan fungsi. Itu harus sudah dibuat dan ditautkan ke GraphQL API Anda di AWS AppSync layanan.

    4. runtime, atau lingkungan dan bahasa fungsi. Untuk JavaScript, namanya harusAPPSYNC_JS, dan runtime,1.0.0.

    5. Pen code angan, atau permintaan dan respons fungsi Anda. Meskipun Anda dapat mengetiknya secara manual, jauh lebih mudah untuk menambahkannya ke file.txt (atau format serupa) dan kemudian meneruskannya sebagai argumen.

      catatan

      Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:

      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; }

    Contoh perintah mungkin terlihat seperti ini:

    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}

    Output akan dikembalikan dalam CLI. Inilah contohnya:

    { "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" } }
    catatan

    Pastikan Anda merekam functionId suatu tempat karena ini akan digunakan untuk melampirkan fungsi ke resolver.

Untuk membuat resolver Anda

  • Buat fungsi pipeline untuk Query dengan menjalankan create-resolver perintah.

    Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

    1. api-iddari API Anda.

    2. Jenistype-name, atau objek khusus dalam skema Anda (Query, Mutation, Subscription).

    3. Oper field-name asi, atau bidang di dalam tipe objek khusus yang ingin Anda lampirkan resolver.

    4. Thekind, yang menentukan unit atau penyelesai pipa. Setel ini PIPELINE untuk mengaktifkan fungsi pipeline.

    5. pipeline-config, atau fungsi untuk dilampirkan ke resolver. Pastikan Anda mengetahui functionId nilai-nilai fungsi Anda. Urutan daftar penting.

    6. Ituruntime, yang adalah APPSYNC_JS (JavaScript). runtimeVersionSaat ini adalah1.0.0.

    7. Thecode, yang berisi penangan langkah sebelum dan sesudah.

      catatan

      Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:

      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; }

    Contoh perintah mungkin terlihat seperti ini:

    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}

    Output akan dikembalikan dalam CLI. Inilah contohnya:

    { "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
Tip

Sebelum Anda menggunakan CDK, kami sarankan meninjau dokumentasi resmi CDK bersama dengan AWS AppSync referensi CDK.

Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini tidak dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

Aplikasi dasar akan membutuhkan hal-hal berikut:

  1. Arahan impor layanan

  2. Kode skema

  3. Generator sumber data

  4. Kode fungsi

  5. Kode resolver

Dari bagian Merancang skema Anda dan Melampirkan sumber data, kita tahu bahwa file tumpukan akan menyertakan arahan impor dari formulir:

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'
catatan

Di bagian sebelumnya, kami hanya menyatakan cara mengimpor AWS AppSync konstruksi. Dalam kode nyata, Anda harus mengimpor lebih banyak layanan hanya untuk menjalankan aplikasi. Dalam contoh kita, jika kita membuat aplikasi CDK yang sangat sederhana, kita setidaknya akan mengimpor AWS AppSync layanan bersama dengan sumber data kita, yang merupakan tabel DynamoDB. Kami juga perlu mengimpor beberapa konstruksi tambahan untuk menerapkan aplikasi:

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';

Untuk meringkas masing-masing:

  • import * as cdk from 'aws-cdk-lib';: Ini memungkinkan Anda untuk menentukan aplikasi CDK Anda dan konstruksi seperti tumpukan. Ini juga berisi beberapa fungsi utilitas yang berguna untuk aplikasi kita seperti memanipulasi metadata. Jika Anda terbiasa dengan arahan impor ini, tetapi bertanya-tanya mengapa pustaka inti cdk tidak digunakan di sini, lihat halaman Migrasi.

  • import * as appsync from 'aws-cdk-lib/aws-appsync';: Ini mengimpor AWS AppSync layanan.

  • import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';: Ini mengimpor layanan DynamoDB.

  • import { Construct } from 'constructs';: Kita membutuhkan ini untuk mendefinisikan konstruksi akar.

Jenis impor tergantung pada layanan yang Anda panggil. Kami merekomendasikan melihat dokumentasi CDK untuk contoh. Skema di bagian atas halaman akan menjadi file terpisah di aplikasi CDK Anda sebagai .graphql file. Dalam file stack, kita dapat mengaitkannya dengan GraphQL baru menggunakan formulir:

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

Dalam ruang lingkupadd_api, kami menambahkan GraphQL API baru menggunakan new kata kunci yang diikuti olehappsync.GraphqlApi(scope: Construct, id: string , props: GraphqlApiProps). Cakupan kami adalahthis, id CFN adalahgraphQL-example, dan alat peraga kami adalah my-first-api (nama API di konsol) dan schema.graphql (jalur absolut ke file skema).

Untuk menambahkan sumber data, pertama-tama Anda harus menambahkan sumber data Anda ke tumpukan. Kemudian, Anda perlu mengaitkannya dengan GraphQL API menggunakan metode khusus sumber. Asosiasi akan terjadi ketika Anda membuat fungsi resolver Anda. Sementara itu, mari kita gunakan contoh dengan membuat tabel DynamoDB menggunakan: dynamodb.Table

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

Jika kita menggunakan ini dalam contoh kita, kita akan menambahkan tabel DynamoDB baru dengan id CFN posts-table dan kunci partisi dari. id (S)

Selanjutnya, kita perlu mengimplementasikan resolver kita di file stack. Berikut adalah contoh kueri sederhana yang memindai semua item dalam tabel 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], });
catatan

Pertama, kami membuat fungsi yang disebutadd_func. Urutan pembuatan ini mungkin tampak agak berlawanan dengan intuisi, tetapi Anda harus membuat fungsi di resolver pipeline Anda sebelum Anda membuat resolver itu sendiri. Sebuah fungsi mengikuti bentuk:

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

Ruang lingkup kami adalahthis, id CFN kami adalahfunc-get-posts, dan alat peraga kami berisi detail fungsi yang sebenarnya. Di dalam alat peraga, kami menyertakan:

  • Fungsi name yang akan hadir di AWS AppSync konsol (get_posts_func_1).

  • API GraphQL yang kami buat sebelumnya (add_api).

  • Sumber data; ini adalah titik di mana kita menghubungkan sumber data ke nilai GraphQL API, lalu melampirkannya ke fungsi. Kami mengambil tabel yang kami buat (add_ddb_table) dan melampirkannya ke GraphQL API (add_api) menggunakan salah satu GraphqlApi metode (addDynamoDbDataSource). Nilai id (table-for-posts) adalah nama sumber data di AWS AppSync konsol. Untuk daftar metode khusus sumber, lihat halaman berikut:

  • Kode berisi penangan permintaan dan respons fungsi kita, yang merupakan pemindaian dan pengembalian sederhana.

  • Runtime menentukan bahwa kita ingin menggunakan runtime APPSYNC_JS versi 1.0.0. Perhatikan bahwa ini saat ini satu-satunya versi yang tersedia untuk APPSYNC_JS.

Selanjutnya, kita perlu melampirkan fungsi ke resolver pipeline. Kami membuat resolver kami menggunakan formulir:

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

Ruang lingkup kami adalahthis, id CFN kami adalahpipeline-resolver-get-posts, dan alat peraga kami berisi detail fungsi yang sebenarnya. Di dalam alat peraga, kami memasukkan:

  • API GraphQL yang kami buat sebelumnya (add_api).

  • Nama tipe objek khusus; ini adalah operasi query, jadi kami hanya menambahkan nilainyaQuery.

  • Nama bidang (getPost) adalah nama bidang dalam skema di bawah Query tipe.

  • Kode berisi penangan sebelum dan sesudah Anda. Contoh kami hanya mengembalikan hasil apa pun dalam konteks setelah fungsi melakukan operasinya.

  • Runtime menentukan bahwa kita ingin menggunakan runtime APPSYNC_JS versi 1.0.0. Perhatikan bahwa ini saat ini satu-satunya versi yang tersedia untuk APPSYNC_JS.

  • Konfigurasi pipeline berisi referensi ke fungsi yang kami buat (add_func).

Untuk meringkas apa yang terjadi dalam contoh ini, Anda melihat AWS AppSync fungsi yang mengimplementasikan pengendali permintaan dan respons. Fungsi ini bertanggung jawab untuk berinteraksi dengan sumber data Anda. Penangan permintaan mengirim Scan operasi ke AWS AppSync, menginstruksikan operasi apa yang harus dilakukan terhadap sumber data DynamoDB Anda. Penangan respons mengembalikan daftar item (ctx.result.items). Daftar item kemudian dipetakan ke tipe Post GraphQL secara otomatis.

Membuat penyelesai mutasi dasar

Bagian ini akan menunjukkan kepada Anda cara membuat resolver mutasi dasar.

Console
  1. Masuk ke Konsol Manajemen AWS dan buka AppSync konsol.

    1. Di dasbor API, pilih GraphQL API Anda.

    2. Di Sidebar, pilih Skema.

  2. Di bawah bagian Resolvers dan jenis Mutasi, pilih Lamp irkan di sebelah bidang Anda.

    catatan

    Dalam contoh kita, kita melampirkan resolver untukcreatePost, yang menambahkan Post objek ke tabel kita. Mari kita asumsikan kita menggunakan tabel DynamoDB yang sama dari bagian terakhir. Kunci partisinya diatur ke id dan kosong.

  3. Pada halaman Lamp irkan resolver, di bawah Jenis Resolver, pilih. pipeline resolvers Sebagai pengingat, Anda dapat menemukan informasi lebih lanjut tentang resolver di sini. Untuk runtime Resolver, pilih APPSYNC_JS untuk mengaktifkan JavaScript runtime.

  4. Anda dapat mengaktifkan caching untuk API ini. Sebaiknya matikan fitur ini untuk saat ini. Pilih Buat.

  5. Pilih Tambahkan fungsi, lalu pilih Buat fungsi baru. Atau, Anda mungkin melihat tombol Buat fungsi untuk memilih sebagai gantinya.

    1. Pilih sumber data Anda. Ini harus menjadi sumber yang datanya akan Anda manipulasi dengan mutasi.

    2. Masukkan aFunction name.

    3. Di bawah kode fungsi, Anda harus mengimplementasikan perilaku fungsi. Ini adalah mutasi, jadi permintaan idealnya akan melakukan beberapa operasi pengubah status pada sumber data yang dipanggil. Hasilnya akan diproses oleh fungsi respons.

      catatan

      createPostmenambahkan, atau “menempatkan”, yang baru Post di tabel dengan parameter kami sebagai data. Kita bisa menambahkan sesuatu seperti ini:

      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; }

      Pada langkah ini, kami juga menambahkan request dan response berfungsi:

      • request: Penangan permintaan menerima konteks sebagai argumen. Pernyataan pengembalian request handler melakukan PutItem perintah, yang merupakan operasi DynamoDB bawaan (lihat di sini atau di sini untuk contoh). Per PutItem intah menambahkan Post objek ke tabel DynamoDB kami dengan mengambil key nilai partisi (secara otomatis dihasilkan olehutil.autoid()) dan attributes dari input argumen konteks (ini adalah nilai yang akan kami sampaikan dalam permintaan kami). Argumen attributes adalah id dan adalah date dan title bidang. key Keduanya telah diformat sebelumnya melalui util.dynamodb.toMapValues helper untuk bekerja dengan tabel DynamoDB.

      • response: Respons menerima konteks yang diperbarui dan mengembalikan hasil dari pengendali permintaan.

    4. Pilih Buat setelah Anda selesai.

  6. Kembali ke layar resolver, di bawah Fungsi, pilih drop-down Tambahkan fungsi dan tambahkan fungsi Anda ke daftar fungsi Anda.

  7. Pilih Simpan untuk memperbarui resolver.

CLI

Untuk menambahkan fungsi Anda

  • Buat fungsi untuk resolver pipeline Anda menggunakan create-function perintah.

    Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

    1. api-iddari API Anda.

    2. nameFungsi di AWS AppSync konsol.

    3. data-source-name, atau nama sumber data yang akan digunakan fungsi. Itu harus sudah dibuat dan ditautkan ke GraphQL API Anda di AWS AppSync layanan.

    4. runtime, atau lingkungan dan bahasa fungsi. Untuk JavaScript, namanya harusAPPSYNC_JS, dan runtime,1.0.0.

    5. Pen code angan, atau permintaan dan respons fungsi Anda. Meskipun Anda dapat mengetiknya secara manual, jauh lebih mudah untuk menambahkannya ke file.txt (atau format serupa) lalu meneruskannya sebagai argumen.

      catatan

      Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:

      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; }

    Contoh perintah mungkin terlihat seperti ini:

    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}

    Output akan dikembalikan dalam CLI. Inilah contohnya:

    { "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" } }
    catatan

    Pastikan Anda merekam functionId suatu tempat karena ini akan digunakan untuk melampirkan fungsi ke resolver.

Untuk membuat resolver Anda

  • Buat fungsi pipeline untuk Mutation dengan menjalankan create-resolver perintah.

    Anda harus memasukkan beberapa parameter untuk perintah khusus ini:

    1. api-iddari API Anda.

    2. Jenistype-name, atau objek khusus dalam skema Anda (Query, Mutation, Subscription).

    3. Oper field-name asi, atau bidang di dalam tipe objek khusus yang ingin Anda lampirkan resolver.

    4. Thekind, yang menentukan unit atau penyelesai pipa. Setel ini PIPELINE untuk mengaktifkan fungsi pipeline.

    5. pipeline-config, atau fungsi untuk dilampirkan ke resolver. Pastikan Anda mengetahui functionId nilai-nilai fungsi Anda. Urutan daftar penting.

    6. Ituruntime, yang adalah APPSYNC_JS (JavaScript). runtimeVersionSaat ini adalah1.0.0.

    7. Yangcode, yang berisi langkah sebelum dan sesudah.

      catatan

      Kode kueri kami akan berada dalam file yang diteruskan sebagai argumen:

      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; }

    Contoh perintah mungkin terlihat seperti ini:

    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}

    Output akan dikembalikan dalam CLI. Inilah contohnya:

    { "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
Tip

Sebelum Anda menggunakan CDK, kami sarankan meninjau dokumentasi resmi CDK bersama dengan AWS AppSync referensi CDK.

Langkah-langkah yang tercantum di bawah ini hanya akan menampilkan contoh umum cuplikan yang digunakan untuk menambahkan sumber daya tertentu. Ini tidak dimaksudkan untuk menjadi solusi yang berfungsi dalam kode produksi Anda. Kami juga menganggap Anda sudah memiliki aplikasi yang berfungsi.

  • Untuk membuat mutasi, dengan asumsi Anda berada di proyek yang sama, Anda dapat menambahkannya ke file tumpukan seperti kueri. Berikut adalah fungsi dan resolver yang dimodifikasi untuk mutasi yang menambahkan yang baru Post ke tabel:

    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], });
    catatan

    Karena mutasi ini dan kueri memiliki struktur yang sama, kami hanya akan menjelaskan perubahan yang kami buat untuk membuat mutasi.

    Dalam fungsi, kami mengubah id CFN menjadi func-add-post dan nama add_posts_func_1 untuk mencerminkan fakta bahwa kami menambahkan Posts ke tabel. Di sumber data, kami membuat asosiasi baru ke tabel (add_ddb_table) kami di AWS AppSync konsol table-for-posts-2 karena addDynamoDbDataSource metode mengharuskannya. Perlu diingat, asosiasi baru ini masih menggunakan tabel yang sama yang kita buat sebelumnya, tetapi sekarang kita memiliki dua koneksi ke sana di AWS AppSync konsol: satu untuk kueri sebagai table-for-posts dan satu untuk mutasi sebagaitable-for-posts-2. Kode diubah untuk menambahkan a Post dengan menghasilkan id nilainya secara otomatis dan menerima input klien untuk sisa bidang.

    Di resolver, kami mengubah nilai id pipeline-resolver-create-posts untuk mencerminkan fakta bahwa kami menambahkan Posts ke tabel. Untuk mencerminkan mutasi dalam skema, nama tipe diubah menjadiMutation, dan namanya,createPost. Konfigurasi pipeline diatur ke fungsi mutasi baru kamiadd_func_2.

Untuk meringkas apa yang terjadi dalam contoh ini, AWS AppSync secara otomatis mengubah argumen yang ditentukan di createPost bidang dari skema GraphQL Anda menjadi operasi DynamoDB. Contoh menyimpan catatan di DynamoDB menggunakan kunciid, yang secara otomatis dibuat menggunakan helper kamiutil.autoId(). Semua bidang lain yang Anda berikan ke argumen konteks (ctx.args.input) dari permintaan yang dibuat di AWS AppSync konsol atau sebaliknya akan disimpan sebagai atribut tabel. Baik kunci maupun atribut secara otomatis dipetakan ke format DynamoDB yang kompatibel menggunakan helper. util.dynamodb.toMapValues(values)

AWS AppSync juga mendukung alur kerja pengujian dan debug untuk mengedit resolver. Anda dapat menggunakan context objek tiruan untuk melihat nilai templat yang diubah sebelum memanggilnya. Secara opsional, Anda dapat melihat permintaan lengkap ke sumber data secara interaktif saat menjalankan kueri. Untuk informasi selengkapnya, lihat Peng ujian dan debug resolver (JavaScript) dan Pem antauan dan pencatatan.

Resolver lanjutan

Jika Anda mengikuti bagian pagination opsional di Mer ancang skema Anda, Anda masih perlu menambahkan resolver ke permintaan Anda untuk menggunakan pagination. Contoh kami menggunakan pagination query yang dipanggil getPosts untuk mengembalikan hanya sebagian dari hal-hal yang diminta pada satu waktu. Kode resolver kami di bidang itu mungkin terlihat seperti ini:

/** * 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 }; }

Dalam permintaan, kami meneruskan dalam konteks permintaan. Kami limit adalah20, artinya kami mengembalikan hingga 20 Posts dalam kueri pertama. K nextToken ursor kami tetap pada Post entri pertama di sumber data. Ini diteruskan ke args. Permintaan kemudian melakukan pemindaian dari yang pertama Post hingga nomor batas pemindaian. Sumber data menyimpan hasil dalam konteks, yang diteruskan ke respons. Respons mengembalikan yang Posts diambil, lalu menyetel yang nextToken disetel ke Post entri tepat setelah batas. Permintaan berikutnya dikirim untuk melakukan hal yang sama persis tetapi mulai dari offset tepat setelah kueri pertama. Perlu diingat bahwa permintaan semacam ini dilakukan secara berurutan dan tidak secara paralel.