【问题标题】:apollo graphql query an uploaded fileapollo graphql 查询上传的文件
【发布时间】:2019-12-30 18:46:00
【问题描述】:

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

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

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

一些想法:
我想查询类似于

query {
  fetchImage(id: 'someid')
}

使用各自的服务器端定义

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

提示: Upload 是一种标量类型,apollo-server 会自动添加到您的类型定义中。它用于上传,所以我想象它也可用于下载/查询。请阅读上述博文了解更多信息。

【问题讨论】:

    标签: node.js file-upload download graphql apollo


    【解决方案1】:

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

    如果你走这条路,你必须使用你自己的标量或对象类型——Upload 标量不支持序列化,所以如果你尝试将它用作输出类型,它会抛出(它不是反正真的很适合这种事情)。

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

    【讨论】:

    • 自从阿波罗实现了多部分/表单数据上传机制(不是序列化文件)你知道关于实现类似的东西来检索文件吗?或者这就是您所说的技术上可行但不可取的意思?
    • 对于这个愚蠢的问题我感到非常抱歉,但是为什么不建议使用相反的等效功能(下载/查询功能)并因此应该单独完成时首先实现上传功能?
    • 要明确 - 出于同样的原因,您不建议使用 Express 静态地提供文件(即响应时间和内存使用)。存在上传功能是因为有一个明确的用例希望在同一个请求中同时提供文件和一些相关数据。如果您已经公开了 GraphQL 端点,则为上传实现一个或多个单独的端点可能会很麻烦,特别是如果您想为这些端点包含验证、文档等。
    • 想要获取有关资源的信息并同时下载一些相关文件并不是一个非常常见的用例。让 API 返回文件的 url 更适合大多数情况。例如,您不希望请求个人资料并让浏览器突然开始下载个人资料照片。
    • 非常感谢您的解释。 (我使用 MongoDB + GridFS 进行文件处理,因此我必须通过 apollo/express 来提供我的文件......我有一个相对较小的应用程序,因此我不需要绝对最佳性能 -这就是我问的原因:))
    【解决方案2】:

    您可以通过使用 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
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 2019-04-02
      • 2018-10-19
      • 2021-03-02
      • 2020-10-01
      • 2018-03-02
      • 2021-07-04
      • 2019-01-26
      • 2021-07-04
      相关资源
      最近更新 更多