node.js - apollo graphql 查询上传的文件

标签 node.js file-upload download graphql apollo

Apollo Server 2.0 能够接收文件上传,如 this blog post 中所述。 .

但是,我找到的所有教程和博客文章都只展示了如何上传文件。没有人演示如何实际检索文件并将其显示在屏幕上。

有人知道如何正确查询文件内容以在屏幕上显示吗?
另外,可能无法查询文件,而您必须构建一个单独的休息端点来检索内容?

一些想法:
我想象查询是这样的

query {
  fetchImage(id: 'someid')
}

使用各自的服务器端定义

type Query {
  fetchImage(id : ID!): Upload //maybe also a custom type, but how do I include the actual file contents?
}

Hint: Upload is a scalar type that apollo-server automatically adds to your type definition. It is used for the upload so I imaging it also being usable for the download/query. Please read the blog post mentioned above for more information.

最佳答案

来自 GraphQL 服务的响应始终序列化为 JSON 对象。从技术上讲,序列化中可以使用 JSON 以外的格式,但实际上仅使用 JSON,因为它满足 serialization requirements in the spec 。因此,通过 GraphQL 发送文件的唯一方法是将文件转换为某种与 JSON 兼容的格式。例如,您可以将 Buffer 转换为字节数组并将其作为整数数组发送。您还必须发送适当的 mime 类型。客户端在收到响应后将字节数组转换回可用格式。

如果您选择这条路线,则必须使用自己的标量或对象类型 - Upload 标量不支持序列化,因此如果您尝试将其用作输出类型,则会抛出异常(而且它实际上并不适合此类事情)。

但是,虽然这样做在技术上是可行的,但也是不建议的。序列化较大的文件可能会导致内存不足,因为无法通过 GraphQL 传输数据(整个响应必须位于内存中才能发送)。静态地提供文件要好得多 ( ideally using nginx instead of Node )。如果您的 API 需要引用该文件,它只需返回文件的路径即可。

关于node.js - apollo graphql 查询上传的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57660226/

相关文章:

node.js - 有什么方法可以在应用崩溃时自动重启?

mysql - TypeScript 正确输入查询结果 MySQL

javascript - 使用 Cheerio 和 Response for Node 网络抓取工具,将响应函数结果传递到 View

file-upload - Docker Rocket chat Rest api上传文件报错413 Entity too large

ios - 将音频文件下载到文件管理器中需要从本地路径播放它

php - 使用 PHP 发送文件时可恢复下载?

node.js - 在nodejs中将一个大文件附加到另一大文件

java - 在java中使用ReSTLet multipart/form-data上传文件

php - 如何从终端或 phpmyadmin 导入大小为 150MB 的 .sql 文件

php readfile() 和 fopen() 损坏/损坏下载