Erste Schritte mit AWS
Erstellen einer Full-Stack-React-Anwendung
Erstellen Sie eine einfache Web-Anwendung mit AWS Amplify
Modul 5: Speicher hinzufügen
In diesem Modul fügen Sie Speicher hinzu und haben die Möglichkeit, den Notizen in Ihrer Anwendung ein Bild zuzuordnen
Übersicht
Nun, da die Notizen-Anwendung funktioniert, wollen wir die Möglichkeit hinzufügen, jeder Notiz ein Bild zuzuordnen. In diesem Modul verwenden Sie die Amplify CLI und Bibliotheken, um einen Speicher-Service mit Amazon S3 zu erstellen. Sie aktualisieren dann das GraphQL-Schema, das Sie im vorherigen Modul erstellt haben, um jeder Notiz ein Bild zuzuordnen. Abschließend aktualisieren Sie die React-Anwendung, um das Hochladen, Abrufen und Rendern von Bildern zu ermöglichen.
Was Sie erreichen werden
- Erstellen eines Speicher-Services
- Aktualisieren eines GraphQL-Schemas
- Aktualisieren Ihrer React-Anwendung
Wichtige Konzepte
Speicher-Service – Das Speichern und Abfragen von Dateien wie Bild und Videos ist für die meisten Anwendungen eine allgemeine Anforderung. Eine Möglichkeit, dies zu tun, besteht darin, die Datei Base64 zu codieren und als Zeichenfolge zu senden, um sie in der Datenbank zu speichern. Dies bringt Nachteile mit sich, etwa, dass die codierte Datei größer als die ursprüngliche Binärdatei ist, der Vorgang rechenintensiv ist und die ordnungsgemäße Codierung und Decodierung komplexer wird. Eine weitere Option ist ein speziell für die Dateiablage entwickelter und optimierter Service. Um dies so einfach, leistungsstark und kostengünstig wie möglich zu gestalten, gibt es Speicherdienste wie Amazon S3.
Benötigte Zeit
10 Minuten
Verwendete Services
Implementierung
-
Erstellen des Speicher-Service
Um die Speicherfunktion für Bilder hinzuzufügen, verwenden wir die Amplify-Speicherkategorie. Sie können die Standardeinstellungen für die meisten der unten aufgeführten Optionen beibehalten. Achten Sie jedoch darauf, die Optionen Erstellen/Aktualisieren, Lesen und Löschen einzeln auszuwählen, indem Sie jeweils die Leertaste drücken, bevor Sie die Eingabetaste drücken, um mit der Eingabeaufforderung fortzufahren.
amplify add storage ? Select from one of the below mentioned services: Content (Images, audio, video, etc.) ? Provide a friendly name for your resource that will be used to label this category in the project: imagestorage ? Provide bucket name: <your-unique-bucket-name> ? Who should have access: Auth users only ? What kind of access do you want for Authenticated users? create/update, read, delete ? Do you want to add a Lambda Trigger for your S3 Bucket? (y/N) no
-
Aktualisieren des GraphQL-Schemas
Öffnen Sie dann amplify/backend/api/notesapp/schema.graphql und aktualisieren Sie es mit dem folgenden Schema:
type Note @model @auth(rules: [ { allow: public } ] ){ id: ID! name: String! description: String image: String }
Stellen Sie sicher, dass Sie die Datei speichern.
-
Bereitstellung von Speicher-Service und API-Aktualisierungen
Nun, da der Speicher-Service lokal konfiguriert wurde und wir das GraphQL-Schema aktualisiert haben, können wir die Aktualisierungen durch Ausführen des Amplify-Push-Befehls bereitstellen:
amplify push --y
-
Aktualisieren der React-Anwendung
Nun, da das Backend aktualisiert wurde, wollen wir die React-App aktualisieren, um die Funktionalität zum Hochladen und Anzeigen von Bildern für eine Notiz hinzuzufügen. Öffnen Sie src/App.js und nehmen Sie die folgenden Änderungen vor.
a. Fügen Sie zunächst die Speicherklasse und die Bild-Komponente zu Ihren Amplify-Importen hinzu:
import { API, Storage } from 'aws-amplify'; import { Button, Flex, Heading, Image, Text, TextField, View, withAuthenticator, } from '@aws-amplify/ui-react';
b. Aktualisieren Sie die Funktion fetchNotes, um ein Bild abzurufen, wenn einer Notiz ein Bild zugeordnet ist:
async function fetchNotes() { const apiData = await API.graphql({ query: listNotes }); const notesFromAPI = apiData.data.listNotes.items; await Promise.all( notesFromAPI.map(async (note) => { if (note.image) { const url = await Storage.get(note.name); note.image = url; } return note; }) ); setNotes(notesFromAPI); }
c. Aktualisieren Sie die Funktion createNote, um das Bild zum lokalen Image-Array hinzuzufügen, wenn der Notiz ein Bild zugeordnet ist:
async function createNote(event) { event.preventDefault(); const form = new FormData(event.target); const image = form.get("image"); const data = { name: form.get("name"), description: form.get("description"), image: image.name, }; if (!!data.image) await Storage.put(data.name, image); await API.graphql({ query: createNoteMutation, variables: { input: data }, }); fetchNotes(); event.target.reset(); }
d. Aktualisieren Sie die Funktion deleteNote, um beim Löschen von Notizen Dateien aus dem Speicher zu löschen:
async function deleteNote({ id, name }) { const newNotes = notes.filter((note) => note.id !== id); setNotes(newNotes); await Storage.remove(name); await API.graphql({ query: deleteNoteMutation, variables: { input: { id } }, }); }
e. Fügen Sie dem Formular im Rückgabeblock eine zusätzliche Eingabe hinzu:
<View name="image" as="input" type="file" style={{ alignSelf: "end" }} />
f. Rendern Sie beim Zuordnen über das Notizen-Array ein Bild, falls vorhanden:
{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> {note.image && ( <Image src={note.image} alt={`visual aid for ${notes.name}`} style={{ width: 400 }} /> )} <Button variation="link" onClick={() => deleteNote(note)}> Delete note </Button> </Flex> ))}
g. Übernehmen Sie Ihre Änderungen und übertragen Sie sie auf GitHub. Warten Sie dann, bis die Erstellung abgeschlossen ist, um Ihre vollständige Anwendung live zu sehen!
git add . git commit -m "Added graphql and storage" git push origin main
-
Anwendung ausführen
Um die Anwendung zu testen, führen Sie den Startbefehl aus:
npm start
Sie sollten nun in der Lage sein, optional für jede Notiz ein Bild hochzuladen.
-
Löschen der Ressourcen
Entfernen einzelner Services
Um einzelne Services zu entfernen, können Sie den Amplify remove-Befehl verwenden:
amplify remove auth ? Choose the resource you would want to remove: <your-service-name>
Führen Sie dann den Amplify push-Befehl aus:
amplify push
Löschen des gesamten Projekts
Um das Projekt und die zugehörigen Ressourcen zu löschen, können Sie den Befehl Amplify löschen ausführen:
amplify delete
Fazit
Sie haben eine Webanwendung mit AWS Amplify bereitgestellt! Sie haben Ihrer Anwendung eine Authentifizierung hinzugefügt, mit der Benutzer sich anmelden, einloggen und ihr Konto verwalten können. Die Anwendung verfügt außerdem über eine skalierbare GraphQL-API, die mit einer Amazon-DynamoDB-Datenbank konfiguriert ist und es Benutzern ermöglicht, Notizen zu erstellen und zu löschen. Sie haben außerdem mithilfe von Amazon S3 Dateispeicher hinzugefügt, sodass Benutzer Bilder hochladen und in ihrer Anwendung anzeigen können.
Herzlichen Glückwunsch!
Sie haben eine Webanwendung auf AWS erstellt! Als großen nächsten Schritt sollten Sie tiefer in spezifische AWS-Technologien eintauchen und Ihre Anwendung auf die nächste Stufe bringen.