AWS 入門

建置完整堆疊的 React 應用程式

使用 AWS Amplify 建立簡單的 Web 應用程式

單元 4:新增 GraphQL API 和資料庫

在本單元中,您將使用 Amplify CLI 和程式庫來設定 GraphQL API,並將其新增到您的應用程式

概觀

現在,我們已經建立應用程式並設定了身分驗證,接下來我們要新增一個 API。

在本單元中,您將使用 Amplify CLI 和庫將 API 新增到您的應用程式中。您將建立的 API 是 GraphQL API,它使用由 Amazon DynamoDB (NoSQL 資料庫) 支援的 AWS AppSync (受管的 GraphQL 服務)。(如需 GraphQL 的簡介,請參閱 GraphQL 網站。)

我們將要建立的應用程式是一個記事應用程式,使用者可以用它來建立、刪除和列出筆記。透過本範例,您將能夠很好地了解如何建立許多熱門的 CRUD+L 類型 (建立、讀取、更新、刪除和列出) 應用程式。

您會完成的目標

在本單元中,您將會學習以下內容:
  • 建立和部署 GraphQL API
  • 編寫與 API 互動的前端程式碼

主要概念

API – 提供程式開發界面,允許多個軟體仲介之間的通訊和互動。

GraphQL – 以應用程式具類型表示為基礎的查詢語言和伺服器端 API 實作。此 API 表示通過以 GraphQL 類型系統為基礎的結構描述進行聲明。

 完成時間

15 分鐘

 使用的服務

實作

  • a.透過從應用程式的根目錄執行以下命令,將 GraphQL API 新增到您的應用程式:

    amplify add api
    
    ? Select from one of the below mentioned services: GraphQL
    ? Here is the GraphQL API that we will create. Select a setting to edit or continue: Continue
    ? Choose a schema template: Single object with fields (e.g., "Todo" with ID, name, description)
    ? Do you want to edit the schema now? (Y/n) yes

    b.在文字編輯器中開啟 GraphQL 結構描述:/amplify/backend/api/<api_name>/schema.graphql

    使用以下結構描述更新檔案:

    type Note @model @auth(rules: [ { allow: public } ] ){
      id: ID!
      name: String!
      description: String
    }

    c.儲存檔案。

  • 現在已經在本機對 API 進行了設定,是時候部署它了。為此,請執行 Amplify push 命令:

    amplify push --y

    這會做三件事:

    1. 建立 AWS AppSync API
    2. 建立 DynamoDB 資料表
    3. 在 src/graphql 資料夾中建立可用於查詢 API 的本機 GraphQL 操作

    若要隨時檢視帳戶中的 GraphQL API,請執行下列命令,然後在左側導覽窗格中選取 GraphQL API:

    amplify console api
    
    > Choose GraphQL
    

    若要查看您帳戶中的 Amplify 應用程式,請執行以下命令:

    amplify console
    ? Which site do you want to open? AWS console
  • 現在後端已經部署完畢,讓我們編寫一些程式碼,以允許使用者建立、列出和刪除筆記。

    使用以下程式碼更新 src/App.js

    import React, { useState, useEffect } from "react";
    import "./App.css";
    import "@aws-amplify/ui-react/styles.css";
    import { API } from "aws-amplify";
    import {
      Button,
      Flex,
      Heading,
      Text,
      TextField,
      View,
      withAuthenticator,
    } from "@aws-amplify/ui-react";
    import { listNotes } from "./graphql/queries";
    import {
      createNote as createNoteMutation,
      deleteNote as deleteNoteMutation,
    } from "./graphql/mutations";
    
    const App = ({ signOut }) => {
      const [notes, setNotes] = useState([]);
    
      useEffect(() => {
        fetchNotes();
      }, []);
    
      async function fetchNotes() {
        const apiData = await API.graphql({ query: listNotes });
        const notesFromAPI = apiData.data.listNotes.items;
        setNotes(notesFromAPI);
      }
    
      async function createNote(event) {
        event.preventDefault();
        const form = new FormData(event.target);
        const data = {
          name: form.get("name"),
          description: form.get("description"),
        };
        await API.graphql({
          query: createNoteMutation,
          variables: { input: data },
        });
        fetchNotes();
        event.target.reset();
      }
    
      async function deleteNote({ id }) {
        const newNotes = notes.filter((note) => note.id !== id);
        setNotes(newNotes);
        await API.graphql({
          query: deleteNoteMutation,
          variables: { input: { id } },
        });
      }
    
      return (
        <View className="App">
          <Heading level={1}>My Notes App</Heading>
          <View as="form" margin="3rem 0" onSubmit={createNote}>
            <Flex direction="row" justifyContent="center">
              <TextField
                name="name"
                placeholder="Note Name"
                label="Note Name"
                labelHidden
                variation="quiet"
                required
              />
              <TextField
                name="description"
                placeholder="Note Description"
                label="Note Description"
                labelHidden
                variation="quiet"
                required
              />
              <Button type="submit" variation="primary">
                Create Note
              </Button>
            </Flex>
          </View>
          <Heading level={2}>Current Notes</Heading>
          <View margin="3rem 0">
            {notes.map((note) => (
              <Flex
                key={note.id || note.name}
                direction="row"
                justifyContent="center"
                alignItems="center"
              >
                <Text as="strong" fontWeight={700}>
                  {note.name}
                </Text>
                <Text as="span">{note.description}</Text>
                <Button variation="link" onClick={() => deleteNote(note)}>
                  Delete note
                </Button>
              </Flex>
            ))}
          </View>
          <Button onClick={signOut}>Sign Out</Button>
        </View>
      );
    };
    
    export default withAuthenticator(App);

    我們的應用程式具有三項主要功能:

    1. fetchNotes – 此函數使用 API ​​類將查詢傳送到 GraphQL API 並擷取筆記清單。
    2. createNote – 此函數還使用 API 類別,將變動傳送至 GraphQL API。主要區別在於,在此函數中,我們傳遞了 GraphQL 變動所需的變數,以便使用表單資料建立新的筆記。
    3. deleteNote - 與 createNote 一樣,此函數傳送 GraphQL 變動以及一些變數,但不是建立筆記,而是刪除筆記。
  • 要測試該應用程式,執行 start 命令:

    npm start

結語

您現在已經建立了一個記事應用程式。透過使用 AWS Amplify,您為您的應用程式新增了 GraphQL API,並設定了建立、讀取和刪除功能。在下一個單元中,我們將學習如何為應用程式新增儲存服務。

本頁對您是否有幫助?

新增儲存體