J'essaie de configurer une interface de téléchargement de fichiers graphQl à l'aide d'Apollo-boost-upload. Le code backend est basé sur ce lien https://dev.to/dnature/handling-file-uploads-with-apollo-server-2-0-14n7. Après avoir ajouté les lignes suivantes dans le fichier server.js, le point d'arrêt de l'analyseur est désormais atteint
const { apolloUploadExpress } = require("apollo-upload-server"); app.use(apolloUploadExpress({ maxFileSize: 1000000000, maxFiles: 10 }));
Après avoir modifié la structure du type de téléchargement
scalar Upload
Il s'agit d'un composant Vue
<input type="file" style="display:none" ref="fileInput" accept="image/*" @change="upload" >
//Upload method upload({ target: { files = [] } }) { if (!files.length) { return; } this.logoImage = files[0]; }, //Dispatching action from vue component this.$store.dispatch("uploadLogo", { image: this.logoImage }); //Vuex action const uploadLogo = async (context, payload) => { context.commit("setLoading", true); try { const { data } = await apolloClient.mutate({ mutation: UPLOAD_LOGO, variables: {file: payload.image}, context: { hasUpload: true, }, }); context.commit("setLoading", false); console.log("Logo:", data.uploadLogo); } catch (error) { context.commit("setLoading", false); console.log(error); } }; //Mutation export const UPLOAD_LOGO = gql` mutation uploadLogo($file: Upload!) { uploadLogo(file: $file) { _id path filename mimetype user { _id } } } `; // Apolloclient config on main.js import ApolloClient from "apollo-boost-upload"; import { InMemoryCache } from "apollo-boost"; import VueApollo from "vue-apollo"; // Set up Apollo Client export const defaultClient = new ApolloClient({ uri: "http://localhost:4000/graphql", cache: new InMemoryCache({ addTypename: false, }), fetchOptions: { credentials: "include", }, request: (operation) => { // if no token in local storage, add it if (!localStorage.someToken) { localStorage.setItem("someToken", ""); } // operation adds the token to authorizatrion header, which is sent o backend operation.setContext({ headers: { authorization: "Bearer " + localStorage.getItem("someToken"), }, }); }, onError: ({ graphQLErrors, networkError }) => { if (networkError) { console.log("[networkError]", networkError); } if (graphQLErrors) { for (const error of graphQLErrors) { console.dir(error); if (error.name === "AuthenticationError") { // set auth errir in state store.commit("setError", error); // signout user to clear error store.dispatch("signUserOut"); } } } }, });
Voici le typedef mis à jour pour le backend (ancien code commenté) si cela aide à identifier le problème
const logoUploadTypeDefs = gql` type File { _id: ID! path: String! filename: String! mimetype: String! encoding: String! user: User } # input Upload { # name: String! # type: String! # size: Int! # path: String! # } scalar Upload type Mutation { uploadLogo(file: Upload!): File } type Query { info: String logo: File! } `;
Maintenant, l'application Node plante avec le journal suivant
J'ai dû remplacer "apollo-upload-server" par "graphql-upload"
Changement 1 :
Commentez "apollo-upload-server" et utilisez "graphql-upload"
Dans le middleware, ceci est utilisé
Changement 2 :
Remplacer l'ancien code
De plus, dans l'analyseur, j'ai ajouté ceci
Changement 3 :
Importer le téléchargement depuis graphql-upload dans le fichier de résolution
Voir la documentation Apollo pour plus de détails. Cela corrige le crash du nœud avec l'erreur "_openReadFs a dépassé la taille maximale de la pile d'appels..."