Búsqueda de sitios web

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?

Artículos relacionados