在 GraphQL 中处理文件上传

面试官:小伙子,你的代码为什么这么丝滑?

随着现代 Web 应用程序的发展,越来越多的应用程序需要支持文件上传。GraphQL 是一种新兴的 API 查询语言和运行时,它提供了一种与客户端和服务器之间进行高效通信的方式。在 GraphQL 中处理文件上传是一个相对较新的问题,但是有了一些简单的技巧和最佳实践,您可以容易地在 GraphQL API 中处理文件上传并获得最佳的性能和保障。

GraphQL 和文件上传

GraphQL 是一种查询语言,可以定义如何对服务器进行请求,并且可以精确地返回所需的数据。以前,处理文件上传需要使用多部分表单数据,这可能会导致性能问题和开发人员的困惑。随着 GraphQL 的发展,一些开发者开始考虑使用 GraphQL 来处理文件上传。然而,GraphQL 并不直接支持文件上传,所以需要开发人员自己来实现这个功能。

处理 GraphQL 中的文件上传

处理 GraphQL 中的文件上传分为两个部分:客户端和服务器端。客户端必须准备好文件以便发送到服务器。服务器必须解析传入的文件并将其保存到磁盘上。

客户端

首先,客户端必须准备好上传文件。将文件编码为 Base64 字符串是不推荐的,因为它会增加传输的数据大小。相反,最常用的方法是在发送之前将文件分段,并使用分块上传的数据流将其发送到服务器。对于这个任务,我们可以使用 xhr2 这个 NPM 包来处理文件上传的流程。

以下是示例代码:

----- --- - --- -----------------
----- -------- - --- -----------
----- ---- - ------------------------------------------
----- --------- - ---- - -----
--- ----- - --
--- --- - ----------
--- ------ - --

----------- - ---------- -
    ----- ---- - ----------------- -----
    ----------------------- - ------- ------
    ---------
    ----- - ----
    --- - ----- - ----------
-

---------------- -----------
-------------------

以上代码使用一个 while 循环将文件分段,然后将每个块添加到 FormData 中,最后使用 xhr 对象将其发送到服务器。需要注意的是,如果文件太大,那么在一段时间内无法上传,就需要使用 Web Workers 或 Service Workers 来处理这个问题。

服务器端

当客户端将文件上传到服务器时,服务器必须开箱即用地处理文件。文件传输本质上是将文件切成块,然后逐一上传块。解决这个问题的最佳方案是使用 GraphQL 的 resolve info 上下文,该上下文包含了文件上传所需的所有信息,并且在查询中可以直接使用。

以下是处理 GraphQL 文件上传的 Node.js 示例代码:

----- - ------------- - - --------------------------
----- - ------------------ ------------- - - -------------------
----- -------- - --- -------------------
    ----- -------
    ------- -- -- --
        --------- - ----- ------------- --
        --------- - ----- ------------- --
        --------- - ----- ------------- -
    --
---

----- ---------------- - --- -------------------
    ----- ---------------
    ------- -
        ----------- -
            ----- ---------
            ----- -
                ----- - ----- ------------- -
            --
            -------- ----- -------- - ---- -- - ----------- ---- -- -- -
                ----- - ----------------- --------- --------- -------- - - ----- -----
                ----- ------ - -------------------
                -- -----
                ------ - --------- --------- -------- -- -- ------
            -
        -
    -
---

----- ------ - --- ---------------
    --------- ----------------
---

在本例中,我们使用了一个名为 graphql-upload 的 NPM 包,这是一个用于处理文件上传的库。要上传文件,客户端必须将它们添加到 GraphQL 查询中。必须使用 GraphQL multipart 请求 协议来提交文件,并且服务器必须使用相应的中间件和处理程序。

结论

在 GraphQL 中处理文件上传需要一些注意和工作,但是使用以下最佳实践可以让开发人员最大化地减少错误并实现良好的性能:

  • 在客户端使用分块上传,不要编码文件为 Base64 字符串。
  • 服务器端使用适当的 GraphQL 中间件和处理程序。
  • 尽可能处理文件流而不是将整个文件读入内存中。
  • 使用上下文信息来获取上传文件的信息以及处理它们。

使用这些技巧,您可以处理文件上传并确保您在将来上传文件时能够获得最佳的性能和保障。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6706a8bdd91dce0dc860237a


猜你喜欢

  • 如何尽可能使用 Async Await(ES8/ES2017)?

    异步编程一直是前端开发中的重要话题。在多数情况下,我们使用回调函数或者 Promise 来处理异步操作。但是,ES8(ES2017)中新增的 Async Await 却可以让异步编程更加方便和可读性。

    8 天前
  • 在 Deno 中使用 Handlebars 模板引擎

    Handlebars 是一款流行的 JavaScript 模板引擎,可以帮助你构建动态内容的 HTML 页面。在 Deno 中,我们可以使用 Deno 库和 Handlebars 模板引擎,来快速开发...

    8 天前
  • 解决 Babel 编译常见的 "Unexpected token" 错误的几种方法

    引言 Babel 是最受欢迎的前端编译器之一,可以将 ES6 或 ES7 的代码转化为 ES5 的代码,支持的语言特性非常多,也支持开发者自定义的插件,可以让我们的代码运行在更多的浏览器和运行环境上。

    8 天前
  • ES10 中的一些小变化和细节

    ES10 (ECMAScript 2019) 是 JavaScript 的最新版本,它引入了一些小变化和细节,这些变化和细节不仅是技术层面的,同时也有一定的学习和指导意义。

    8 天前
  • 使用 ESLint 插件自定义 React 规则

    ESLint 是一个 JavaScript 代码检查工具,它可以帮助我们在开发过程中发现并修复潜在的问题。同时,ESLint 还提供了各种规则,用于检查代码中的常见问题,以确保代码风格一致和可读性强。

    8 天前
  • AngularJS 和 Angular 的区别以及升级指南

    AngularJS 和 Angular 都是由 Google 推出的 JavaScript 前端框架,两者都拥有优秀的 MVVM 架构和丰富的生态环境。不过,它们之间存在一些区别,本文将详细介绍这些区...

    8 天前
  • 为什么 Promise 错误处理必须使用 .catch()?

    Promise 是现代 JavaScript 中处理异步编程的标准方式,它简化了回调函数嵌套、提供了更加清晰的代码结构以及更好的错误处理方式。然而,Promise 中的错误处理非常重要,因为错误将会被...

    8 天前
  • Kubernetes 中容器内存泄漏如何检测?

    在 Kubernetes 集群中,容器内存泄漏问题可能导致资源浪费、应用程序异常、应用程序挂起等问题。因此,及时发现并解决容器内存泄漏问题是非常重要的。本文将介绍在 Kubernetes 中检测容器内...

    8 天前
  • GraphQL 错误处理及异常情况排查方法

    GraphQL 是一种查询语言,它可以在客户端定义需要获取的数据,并向服务端发起一个 GraphQL 查询请求。相比于传统的 REST API,GraphQL 能够更加精确地获取所需数据,并且能有效地...

    8 天前
  • 解锁 ES12 中的可选链 (?.) 和空值合并 (??) 运算符

    在 JavaScript 应用程序中,处理数据时经常需要检查对象和属性是否存在。为了简化这个过程并减少代码的复杂性,ES12 引入了可选链 (?.) 和空值合并 (??) 运算符。

    8 天前
  • Deno 中遇到的 NetworkingError: Network failure 该如何解决

    在 Deno 中,我们常常会遇到 NetworkingError: Network failure 的错误提示。这个错误提示通常是在网络请求失败时抛出的,影响我们程序的执行。

    8 天前
  • Vue.js 2.0 如何构建更好的 SPA?

    Vue.js 是一款优秀的前端 JavaScript 框架,它可以帮助我们快速易用地构建高质量的单页应用程序(Single Page Application,SPA),而且在早期版本相比,Vue.js...

    8 天前
  • 开发人员如何使用 Docker 快速部署 ASP.NET Core 应用程序

    简介 在开发和部署应用程序时,使用 Docker 可以大大简化流程、提高效率,降低错误率,并可以有效地隔离应用程序与主机环境之间的依赖。在本文中,我们将介绍如何使用 Docker 快速部署 ASP.N...

    8 天前
  • 学习 ES11:ES2020 中的 Promise.allSettled 详解

    ES2020 是 ECMAScript 标准的最新版本,其中新增的 Promise.allSettled 方法得到了广泛关注和使用。本文将详细介绍该方法的使用,以及它带来的好处,最后提供示例代码。

    8 天前
  • Angular 8 在 Mac 系统中安装及开发环境搭建

    Angular 是一款由 Google 开发的前端框架,它采用 TypeScript 编写。Angular 8 版本于 2019 年 5 月发布,主要是一些小的改进和更新。

    8 天前
  • ES6 生成器函数的使用及常见问题解决

    ES6 是 JavaScript 的一个重大更新版本,其中包括了很多新的语言特性,其中之一就是生成器函数(Generator Function)。它提供了一种生成可暂停执行的函数的方法,并且可以用来写...

    8 天前
  • 提高 GPU 计算性能的优化策略研究

    GPU 是一种专门设计用于进行并行计算的硬件,已经被广泛应用于许多领域,包括游戏、科学计算以及深度学习等。然而,在进行大规模计算时,GPU 的性能优化变得尤为重要。

    8 天前
  • CSS Reset 常见问题解决方案

    在前端开发中,CSS Reset 是一个必须要掌握的技术,用于解决不同浏览器对于 HTML 元素的默认样式可能存在的差异问题。CSS Reset 可以帮助网页设计师和开发人员更好地掌控自定义样式,提高...

    8 天前
  • 探究使用 Server-sent Events 监控业务异常的方法

    引言 在前端开发中,我们经常需要关注我们的网站或者应用程序是否出现了异常操作,以及用户行为是否符合我们的预期。在这些情况下,我们需要一种非常快速响应的方法来帮助我们及时探测到异常问题,以便我们可以迅速...

    8 天前
  • Deno 中如何启用 HTTPS

    Deno 中如何启用 HTTPS 随着互联网的快速发展, HTTPS 已成为了网站安全的基本保障,越来越多的网站已经开始启用 HTTPS 协议。而在前端领域中,Deno 是一个新的优秀的 JavaSc...

    8 天前

相关推荐

    暂无文章