从服务器下载文件的 GraphQL/Apollo 应用程序

Posted

技术标签:

【中文标题】从服务器下载文件的 GraphQL/Apollo 应用程序【英文标题】:GraphQL/Apollo application with file download from server 【发布时间】:2020-12-24 04:29:00 【问题描述】:

我对 GraphQL 有点陌生,这个问题属于“不可能这么难。我必须遗漏一些东西。”

我有一个相当标准的 GraphQL/Apollo/React 应用程序,分为客户端和服务器。客户端进行 API 调用并从服务器取回数据时一切正常。客户端甚至可以将文件上传到服务器。但是,我现在需要服务器流回保存在磁盘上的文件。就是这样。

这是“我必须遗漏一些东西”的部分。我在文档和 *** 上看到的所有内容都是从服务器推送文件并通过 GraphQL 查询作为 base64-endoced 字符串然后在客户端上做一些非常hacky的东西的一些变体,通常涉及隐藏的 href 标签和模拟点击。对此我说,“什么???”

说真的。磁盘上有服务器知道如何查找的文件。客户端需要向用户显示一个按钮,他们可以单击该按钮来下载文件。而已。其他所有语言的所有其他框架都有一个简单的方法来做到这一点。有人可以告诉我我在这里缺少的非常简单的东西吗?

谢谢, 亚历克斯

【问题讨论】:

只返回 url,用 src 渲染 img 和浏览器将完成剩下的工作...... REST API 以同样的方式依赖浏览器行为......采用“纯”它应该响应一些数据,而不是一些标头更改了到达的数据上下文,根本没有响应采购客户端 【参考方案1】:

您缺少的是 GraphQL 确实不应该用于此目的。

虽然 GraphQL 本身 does not specify a specific format for serializing responses,但事实上的格式是 JSON。在 JSON 响应中获取文件的唯一方法是将其序列化为字符串。

如果您想提供静态内容,您应该设置 nginx、Apache 或其他考虑到这一点而构建的 Web 服务器。或者,如果您已经在使用一些现有的 Web 服务器库,例如 Express,它很可能也有提供静态内容的工具。

仅仅因为您有一个 GraphQL 端点并不一定意味着它应该是您的客户端与您的后端通信的唯一方式。

【讨论】:

很公平。我可能需要另一种文件端点。感谢您的回复,这真的很有帮助,因为我仍在学习框架以让某人说“不,不要那样做”。 我们不能为此使用 apollo-link-rest 吗?

以上是关于从服务器下载文件的 GraphQL/Apollo 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

从缓存graphql apollo 2.0读取数据

Apollo GraphQL - 将 .graphql 模式导入为 typeDefs

React Native 上的 GraphQL Apollo 类型生成

Graphql,react-apollo如何在加载组件状态时将变量传递给查询

Nuxt + GraphQL (Apollo) 上传文件

在 GraphQL Apollo Server v2.0 中公开 HTTP GET API