node.js发送graphql上传文件到服务

时间:2019-07-18 19:43:28

标签: node.js express apollo

我正在使用graphql-upload将文件从Web客户端上载到apollo Express服务器到另一台服务器,这需要PUT 要求提供avatarImage的文件。

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

这是我的数据源文件,我在其中将文件的createReadStream附加到表单数据中并将其发送到访存位置。

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 个答案:

答案 0 :(得分:0)

我也面临这个问题,不确定是否是解决该问题的正确方法。无法找到要使用graphql-server-expressgraphql-upload上传到另一服务的任何引用/文档。 (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);
  }