nodejs问题将graphql上传文件发送到服务

Posted

技术标签:

【中文标题】nodejs问题将graphql上传文件发送到服务【英文标题】:nodejs issue sending graphql upload file to service 【发布时间】:2019-11-27 19:26:37 【问题描述】:

我正在使用 graphql-upload 将文件从 Web 客户端上传到 apollo express 服务器到另一台服务器,该服务器需要 PUT 请求 avatarImage 的文件。

文件正确进入uploadLogo()。我可以从快递服务器保存和查看它。当我传递文件流时 到 PUT /avatar,该端点没有收到它。我已经测试过将文件从文件系统直接发送到 /avatar 并且可以确认端点工作正常。

这是我的数据源文件,我将文件的 createReadStream 附加到表单数据并在 fetch put 中发送。

class MyAPI extends RESTDataSource 
  async uploadLogo(id, file) 
      const  createReadStream, filename, mimetype  = await file;
      const stream = createReadStream();

      const formData = new FormData();

      formData.append('avatarImage', stream, 
        contentType: mimetype,
        filename
      );

      const headers = formData.getHeaders();

      return this.put('http://localhost:5000/avatar', formData, headers);
    

将表单数据中的流发送到此 /avatar 端点我缺少什么?

【问题讨论】:

【参考方案1】:

我也面临这个问题,不确定这是否是解决它的正确方法。无法使用 graphql-upload 找到要从 graphql-server-express 上传到另一个服务的任何参考/文档。 (spectrum question for reference)

我实际上必须将文件作为临时文件写入文件系统,并将文件系统读取流传递给形成数据才能使其工作。如果没有临时文件,不知何故标头不正确,并且对于上游来说,内容长度看起来像 10 或一些奇怪的值。

这就是我所做的:

// this is a method on our data-source-rest
async uploadSomeFile( invoices :  invoices: Promise<FileUpload> ) 
    const  createReadStream: apolloFileStream, mimetype, filename  = await invoices;
    const tempFilename = `/tmp/$Date.now()/$filename`;
    const stream = apolloFileStream();
    const wstream = createWriteStream(tempFilename);
    await new Promise((resolve, reject) => 
      stream
        .pipe(wstream)
        .on('finish', () => resolve())
        .on('error', () => reject());
    );
    const rstream = createReadStream(tempFilename);
    const data = new FormData();
    data.append('file', rstream);
    return this.post(`/transactions/upload`, data);
  

【讨论】:

以上是关于nodejs问题将graphql上传文件发送到服务的主要内容,如果未能解决你的问题,请参考以下文章

如何将graphql查询的结果作为文件发送?

使用 Websockets 和 Nodejs 上传文件

使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储

没有从另一个 Nodejs 服务器获得响应?

将数据从服务器(Node.js)发送到 GraphQL 服务器中的客户端(React 组件)

将图像上传到 GraphQL 服务器