Wie würden Sie das tun Datei-uploads in einem Reagieren-Relay-app?
Einen Datei-upload scheint wie eine mutation. Es ist oft begleitet von anderen Daten. Aber es ist ein großer blob, also ich bin mir nicht sicher, wie Sie Sie GraphQL mit Ihr umgehen kann. Wie würden Sie bei der Integration von Datei-uploads in eine app gebaut, mit Relais?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, die Sie schreiben müssen die Relais-update auf Ihrem frontend-Komponente.
Wie diese:
Und Folgen Sie dann durch die Implementierung der mutation auf das frontend:
Und zuletzt implementieren Sie die handler auf der server/schema.
Alle obigen code können Sie finden Sie in meinem repo https://github.com/bfwg/relay-gallery
Es gibt auch eine live-demo https://fanjin.io
Fand ich eine Erklärung in den docs. Sie können eine Unterklasse Relais.Mutation und Umsetzung der getFiles-Funktion.
Auch, express-graphql bietet ein Beispiel in Ihren test-Fälle zu behandeln, wie dies auf der server-Seite.
Ich bin lediglich das teilen der Ergebnisse von Marc-Andre Giroux von seinem blog, die Rails-spezifisch, so werde ich versuchen, es mehr generische und die Bereitstellung der Daten von der Antwort von @Nick.
Gibt es 2 Teile:
Client-side Javascript Code
Den client-seitigen code weiter besteht aus 2 teilen:
Der mutation auf die upload-Datei, die sich Relais.Mutation (UploadFileMutation)
Die Komponente, enthält die Reagieren Komponente (FileUploader) zum Rendern die Benutzeroberfläche für das auswählen der Datei und ruft die mutation zu tun, der upload
Server-Seite Server-Spezifischen Code
Server-side-code besteht aus 2 teilen:
Für NodeJS server Express (extrahiert aus express-graqphl Testfälle wie bereits von @Nick):
Ebenso für eine nicht-JS-server, z.B., RubyOnRails:
Javascript GraphQL Schema:
Für Schienen GraphQL Schema:
Hinzufügen, um die anderen Antworten, mit Relais-Modern, es gab eine kleine änderung, wie Sie sollten, senden Sie die Dateien aus dem client. Anstatt ein
getFiles
in Ihrer mutation und die übergabe der Dateien an den Konstruktor verwenden, können Sie etwas wie das folgende:Den
uploadables
config-option ist etwas versteckt, da es keinen Hinweis auf die Doku, aber es kann hier gefunden werden: https://github.com/facebook/relay/blob/c4430643002ec409d815366b0721ba88ed3a855a/packages/relay-runtime/mutations/commitRelayModernMutation.js#L32Während Sie kann auf jeden Fall umsetzen hochladen von Dateien auf Ihre GraphQL API-Endpunkt, es gilt als ein anti-pattern (Sie stoßen Probleme mit der max Datei Größe etc.).
Eine bessere alternative wäre die Beschaffung einer signierten URL, von Ihrem GraphQL API für das hochladen einer Datei direkt aus der client-side app für Amazon S3, Google Cloud Storage etc.
Wenn die server-side code benötigt, um die URL speichern in die Datenbank, sobald der upload abgeschlossen ist, kann es abonnieren zu dieser Veranstaltung direkt. Überprüfen Sie object change notification in der Google-Cloud als Beispiel.