GraphQL-загрузка данных не работает, когда я пытаюсь отправить их на сервер - PullRequest
0 голосов
/ 31 мая 2019

При использовании graphql-upload, а затем я пытаюсь отправить возвращаемые данные на python-сервер флакона, данные всегда попадают в тело, а не в файл.Заголовок автоматически устанавливается на content-type: multipart/form-data boundary etc...., когда я использую нижеследующий коннектор graphql.

На этом примере я основал многое из нижеприведенного https://github.com/jaydenseric/apollo-upload-examples/blob/master/api/resolvers.mjs

async fileUpload(page, id, file) {
  const { filename, mimetype, createReadStream } = await file;
  const stream = await createReadStream();

  const form = new FormData();
  form.append('file', JSON.stringify({
    filename, mimetype, stream
  }));

  // form.append('file', stream)); // this attempt fails as well

  const url = `/${page}/${id}/file`;

  return this.post(
    url,
    null,
    {
      body: form
    }
  );
}

Моя схема выглядит следующим образомитак:

  type File {
    id: ID!
    page: String!
    name: String
    url: String!
  }

  input FileUploadInput {
    id: ID!
    page: String!
    files: [Upload!]!
  }

  extend type Mutation {
    fileUpload(data: FileUploadInput!): File
  }

Resolver

const { GraphQLUpload } = require('graphql-upload');

const singleFileUpload  (
  root,
  { data: { id, page, files } },
  { dataSources }
) => dataSources.files.fileUpload(id, page, files[0]);

module.exports = {
  Upload: GraphQLUpload,
  Mutation: {
    singleFileUpload
  }
};

1 Ответ

0 голосов
/ 01 июня 2019

По какой-то причине поток чтения, предоставленный graphql, не работал, но сохранял файл локально, а затем создавал readStream для этого файла.

    const { filename, createReadStream } = await file;
    const stream = await createReadStream();

    const { path } = await saveLocally(stream, filename); // this function pipes the stream to save it locally

    const newFile = await fs.createReadStream(path);

    const form = new FormData();
    form.append(
      'file',
      newFile
    );

    // I delete the file after I received a succesful response.
    await fs.unlink(path, (err, res) => {
      if (err) return err;
      return res;
    });

...