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)
我实际上必须将文件作为临时文件写入文件系统,并将文件系统读取流传递给形成数据才能使其工作。如果没有临时文件,不知何故标头不正确,并且对于上游来说,内容长度看起来像 1
或 0
或一些奇怪的值。
这就是我所做的:
// 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上传文件发送到服务的主要内容,如果未能解决你的问题,请参考以下文章
使用 Node 和 graphql 将文件流式上传到 Azure Blob 存储