如何通过 Websocket 协议处理 GraphQL 中的文件上传?

Posted

技术标签:

【中文标题】如何通过 Websocket 协议处理 GraphQL 中的文件上传?【英文标题】:How to handle file uploads in GraphQL over Websocket Protocol? 【发布时间】:2020-04-08 14:53:34 【问题描述】:

我正在创建一个使用 GraphQL 的 Web 应用程序,要求是通过 WebSocket 处理 GraphQL 操作。虽然我设法通过使用订阅-传输-ws 来实现这一点。但是,我非常坚持处理文件上传。不知何故,我遇到了使用socket.io-stream从客户端到服务器的流文件,但这导致有2个用于文本数据和文件的单独API。所以,我想知道是否有办法将此功能结合到 GraphQL 中。

【问题讨论】:

【参考方案1】:

目前,我也在为此找到合适的解决方案,但您可以使用另一种方法,将文件数据转换为 base64 并将该数据作为字符串传递。这种方法只适用于小文件,因为字符串数据类型不能像缓冲区那样存储大量数据。

【讨论】:

我也想到了那个,但这是目前最少的选择,因为我打算处理多个文件,甚至一次处理大尺寸的文件,例如视频。 那么你应该直接在 react 中使用 axios,因为到目前为止 graphql 还没有原生支持。【参考方案2】:

我遇到了完全相同的问题,而且我的文件大小使得转换为 base64 不是一个可行的选择。我也不想在 GraphQL 之外使用单独的库,因为这需要在我的服务器中进行大量设置更改(以同时处理 GraphQL 和非 GraphQL)。

幸运的是,最终解决方案相当简单。我在前端创建了两个 GraphQL 客户端 - 一个专门用于我的大部分流量通过 WebSockets,另一个专门通过 HTTP 仅用于涉及文件上传的操作。

现在我可以根据操作是否涉及文件上传来简单地指定我想要的客户端,而无需对我的服务器进行复杂的更改或影响我所有其他查询的实时优势。

【讨论】:

以上是关于如何通过 Websocket 协议处理 GraphQL 中的文件上传?的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 原理

puppeteer获取网页中的websocket数据

微信小程序配置websocket环境及如何在小程

使用python 多进程进行基于websocket 的实时视频流处理

如何使用 TLS/SSL 确保 WebSocket 连接的安全

如何使用 TLS/SSL 确保 WebSocket 连接的安全