I'm trying to set up a graphQl file upload frontend using Apollo-boost-upload. The backend code is based on this link https://dev.to/dnature/handling-file-uploads-with-apollo-server-2-0-14n7. After adding the following lines in the server.js file, the parser breakpoint is now reached
const { apolloUploadExpress } = require("apollo-upload-server"); app.use(apolloUploadExpress({ maxFileSize: 1000000000, maxFiles: 10 }));
After modifying the schema of the upload type
scalar Upload
This is the Vue component
<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"); } } } }, });
Here is the updated typedef for the backend (old code commented out) if this helps identify the problem
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! } `;
Now, the Node application crashes with the following log
I had to change "apollo-upload-server" to "graphql-upload"
Change 1:
Comment out "apollo-upload-server" and use "graphql-upload"
In the middleware, this
is usedChange 2:
Replace old code
Also, in the parser, I added this
Change 3:
Import Upload from graphql-upload in parser file
See the Apollo documentation for more details. This fixes an issue where node would crash with the error "_openReadFs exceeded maximum call stack size..."