Add support for files upload in your graphql schema. Obtain any number of files in any resolvers at any field depth. Will be good if you get acquainted with graphql-multipart-request-spec
Take a look at commits step by step, it will be easy to follow.
Make proper multipart/form-data POST request with operations and map keys. And don't forget to provide files:
Request via CURL
curl localhost:4000/graphql \ -F operations='{ "query": "mutation ($poster: Upload) { createPost(id: 5, poster: $poster) { id } }", "variables": { "poster": null } }' \ -F map='{ "0": ["variables.poster"] }' \ -F 0=@package.jsonResponse from GraphQL server
{"data":{"createPost":{"id":5}}}Resolver code
createPost: { type: 'Post', args: { id: 'Int!', title: 'String', authorId: 'Int', images: '[Upload]', poster: 'Upload', }, resolve: async (_, { id, title, authorId, images, poster }) => { const newPost = { id, title, authorId }; // somehow work with files if (poster) { console.log('Argument `poster` is a Promise:') console.log(poster); console.log("\nIt's value is and object with FileStream:"); console.log(await poster); } // somehow save a new record posts.push(newPost); return newPost; }, },Console log on the server side
Argument `poster` is a Promise: Promise { { stream: FileStream { _readableState: [Object], readable: true, domain: null, _events: [Object], _eventsCount: 2, _maxListeners: undefined, truncated: false, _read: [Function] }, filename: 'package.json', mimetype: 'application/octet-stream', encoding: '7bit' } } It's value is and object with FileStream: { stream: FileStream { _readableState: ReadableState { objectMode: false, highWaterMark: 16384, buffer: [Object], length: 1983, pipes: null, pipesCount: 0, flowing: null, ended: true, endEmitted: false, reading: false, sync: false, needReadable: false, emittedReadable: true, readableListening: false, resumeScheduled: false, destroyed: false, defaultEncoding: 'utf8', awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, domain: null, _events: { end: [Array], limit: [Object] }, _eventsCount: 2, _maxListeners: undefined, truncated: false, _read: [Function] }, filename: 'package.json', mimetype: 'application/octet-stream', encoding: '7bit' }- apollo-upload-server for parsing
multipart/form-dataPOST requests via busboy
- Babel (ES6, babel-preset-env)
- ESLint
- Flowtype
- express
- express-graphql
- graphql
- graphql-compose
- nodemon
git clone https://github.com/graphql-compose/graphql-compose-boilerplate-upload cd graphql-compose-boilerplate # make it to your own rm -rf .git yarn install # start server with reloading on file changes yarn dev # OR start server yarn start