apollo graphql 查询上传的文件

apollo graphql query an uploaded file

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 需要引用该文件,那么它可以 return 文件的路径。

你可以通过安装带有 apollo 服务器的 express 来做到这一点。

apollo-server-express

安装上述包并使用 Apollo Server 实例化 Express 对象,如包文档中所述。

然后像这样使用 express 设置静态文件夹

app.use("/uploads", express.static("uploads")); //Server Static files over Http

uploads 是我的静态文件夹 & /uploads 将服务器获取对该路径的请求

//Now I can access static files like this
http://localhost:4000/uploads/test.jpg