javascript - Cómo enviar un archivo desde Node.js a una API GraphQL que utiliza la biblioteca graphql-upload
Estoy intentando enviar un archivo desde un script de Node.js a un servidor GraphQL que también se ejecuta en Node, usando ApolloServer y el tipo Upload de la biblioteca GraphQLUpload (estoy importando GraphQLUpload como importación nombrada de la biblioteca y pasándolo a los resolvers).
Hice el siguiente script para hacer eso
import { createApolloFetch } from 'apollo-fetch'
import { createReadStream } from 'fs'
const [_bin, _script, filename] = process.argv
const file = createReadStream(filename)
const query = `
mutation ChangeAvatar($file: Upload!) {
changeAvatar(avatar: $file) {
id
}
}
`
const variables = { file }
const fetch = createApolloFetch({ uri: 'http://localhost:4000' })
fetch({ query, variables })
.then(r => console.log(r))
.catch(e => console.log(e))
Sin embargo, ejecutar el script resulta en un error:
PS C:\Users\kkm\Workspace\app> ts-node .\scripts\fileUpload.ts .\schema.graphql
{
errors: [
{
message: 'Variable "$file" got invalid value { _readableState: { objectMode: false, highWaterMark: 65536, buffer: [Object], length: 0, pipes: null, pipesCount: 0, flowing: null, ended: false, endEmitted: false, reading: false, sync: true, needReadable: false, emittedReadable: false, readableListening: false, resumeScheduled: false, paused: true, emitClose: false, autoDestroy: false, destroyed: false, defaultEncoding: "utf8", awaitDrain: 0, readingMore: false, decoder: null, encoding: null }, readable: true, _events: {}, _eventsCount: 1, path: "."\schema.graphql", fd: null, flags: "r", mode: 438, end: null, autoClose: true, bytesRead: 0, closed: false }; Expected type Upload. Upload value invalid.',
locations: [Array],
extensions: [Object]
}
],
extensions: {
tracing: {
version: 1,
startTime: '2020-05-14T15:06:36.197Z',
endTime: '2020-05-14T15:06:36.198Z',
duration: 578200,
execution: [Object]
}
}
}
Supongo que PUEDE ser causado por la incompatibilidad entre el nuevo método File() disponible en el navegador y el resultado de createReadStream()
¿Hay alguna biblioteca que me permita enviar un archivo similar al del navegador desde Node, o alguna otra forma de hacer que este archivo sea pasado al resolvedor?