GraphQL 如何处理上传文件

GraphQL 是一种用于 API 构建的查询语言和运行时。尤其在前端领域,GraphQL 已经成为了主流,它支持前端应用来组合自由多个请求以及接收想要的数据,而无需受API的限制。不过,谈到上传文件时,GraphQL 需要特定的文件解析器,以处理文件上传请求。本文将详细介绍上传文件的处理过程,并提供示例代码。

文件上传解析器

GraphQL 不能在本身实现文件上传解析,因此需要使用 graphql-upload 解析器。该解析器提供了 GraphQL 操作中 Upload 类型的解析,以及 createReadableStream() 方法将字节流转换为 Node.js 可读流。

服务器端设置

首先,我们需要在服务器端进行以下设置:

安装 graphql-upload

使用 npmyarn 安装 graphql-upload

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

或者

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

服务器端 GraphQL Schema 添加 Upload 类型

在 GraphQL 的服务器端更新 Schema,并添加 Upload 类型。

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

-- ---

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

  -- ---
--

-- ---

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

  -- ---
--

服务器端上传文件解析器

使用 graphql-upload 中的 graphqlUploadExpress() 解析器来处理上传文件。请注意,上传请求应该是 multipart/form-data 类型。

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

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

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

GraphQL 查询设置

在 GraphQL 查询中进行以下设置:

GraphQL 查询添加 Upload 参数

为文件上传创建输入类型,并在查询里添加 Upload 参数。

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

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

Resolver 处理上传文件

使用 createReadStream() 方法创建读取字节流,在服务器端使用该字节流创建文件。

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

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

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

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

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

这里我们假设文件将上传到 ./uploads 文件夹中,并返回了文件的名称、类型、大小和路径。

示例代码

下面是一个完整的服务器端和客户端示例代码:

服务器端代码

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

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

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

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

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

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

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

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

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

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

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

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

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

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

客户端代码

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

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

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

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

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

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

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

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

结论

在本文中,我们通过使用 graphql-upload 解析器和 createReadStream() 方法,实现了针对 GraphQL 的上传文件。我们介绍了在服务器端和客户端建立所需的设置,以及上传文件的完整代码示例。对于需要 GraphQL 上传文件的 Web 应用开发人员而言,本文提供了深入了解如何上传文件的指南。

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


猜你喜欢

  • 在 Node.js 中使用 "query-string" 模块解析 URL 查询字符串的完整指南

    当我们在编写 Node.js 应用程序时,我们可能需要解析 URL 中的查询字符串,以便获取用户提供的信息。在这种情况下,如果我们手动处理查询字符串,我们需要写很多繁琐的代码来解析它。

    4 天前
  • Next.js 中使用 SASS 的技巧

    SASS 是一种 CSS 的预处理器,它提供了许多 CSS 没有的特性,例如嵌套、变量、Mixin 等。与传统的 CSS 相比,SASS 让编写 CSS 变得更加简洁、易于维护,尤其在大型项目中显得尤...

    4 天前
  • 使用 Express.js 和 Socket.io 实现实时通信

    如果你正在寻找一种快速建立基于实时通信的应用程序的方法,那么使用 Express.js 和 Socket.io 可以帮助你实现这个目标。本文将介绍如何用这两个工具来搭建一个简单的实时聊天室,并指导你如...

    4 天前
  • Docker Swarm 入门:集群环境配置完全教程

    Docker Swarm 是一个容器编排工具,可以帮助开发人员更轻松地在集群环境中管理和部署应用程序。本教程将为您提供有关如何配置 Docker Swarm 集群环境的详细说明,并附带示例代码,以便您...

    4 天前
  • CSS Flexbox 实现的响应式网格布局的实现技巧

    CSS Flexbox 实现的响应式网格布局的实现技巧 前言 响应式网格布局在现代Web开发中越来越流行。它可以使得网站能够自适应不同的屏幕尺寸和设备类型,提供更好的用户体验。

    4 天前
  • 在 Hapi.js 中使用 Redis:实现缓存和存储

    在现代 Web 应用程序中,缓存和存储是非常重要的一部分。Redis 是一个流行的内存数据存储解决方案,它对于 Web 应用程序的性能非常有利。在本文中,我们将介绍如何在 Hapi.js 框架中使用 ...

    4 天前
  • 使用 Deno 进行 Web 开发的最佳实践之 —— 安全问题

    前言 Deno 是一个使用 TypeScript 构建的安全的运行时环境,由 Node.js 的创始人 Ryan Dahl 开发。在 Deno 中,JavaScript 代码运行在一个沙盒环境中,可以...

    4 天前
  • 在 Vue.js 中实现无限滚动加载列表的方法总结

    在现代 Web 应用中,无限滚动加载列表已经成为了许多网站和应用中必不可少的功能之一。Vue.js 是当今最受欢迎的 JavaScript 前端框架之一。在这篇文章中,我们将讨论如何在 Vue.js ...

    4 天前
  • 使用 Chai-test-extras 扩展 Chai.js 的能力

    在编写前端测试时,Chai.js 是一个广泛使用的断言库。然而,有时候我们需要更多的扩展能力来满足我们的需求。这时候,Chai-test-extras 是一个非常有用的工具。

    4 天前
  • 使用 TypeScript 和 React 构建高质量的 Web 应用程序

    Web 开发的重要性日益增长,尤其是在当前全球疫情背景下。而构建高质量的 Web 应用程序是每个前端工程师共同的目标。在这种情况下,TypeScript 和 React 成为了前端开发的一种优秀组合,...

    4 天前
  • 基于 ES6 的 Reflect 和 Proxy 实现 JavaScript 中的中间件机制

    介绍 在前端开发中,我们经常需要对请求和响应进行处理和拦截,以实现某些功能。这时候就可以使用中间件模式来实现。中间件模式是一种常用于处理请求和响应的模式,它通过一系列中间件来处理请求和响应,可以实现各...

    4 天前
  • Angular2 移动 SPA 应用场景实战

    引言 随着移动设备的普及和网络的发展,越来越多的网站选择打造移动 SPA(Single Page Application)应用,因为该应用具有加载快、操作简单等优点。

    4 天前
  • 如何使用缓存提高 ASP.NET 应用程序性能

    前言 ASP.NET 是一种基于 Microsoft .NET 框架的服务器端 Web 应用程序框架。在开发和部署 ASP.NET 应用程序时,性能是一个关键问题,特别是在高负载和高并发的情况下。

    4 天前
  • PWA 应用的优化技巧分享

    随着移动互联网的发展,越来越多的网站开始考虑将其转换为 PWA 应用,以提供更好的用户体验和更高的性能。PWA 应用可堪称是当今前端开发的一次大变革,它融合了 Web 和 Native 应用的优点,不...

    4 天前
  • 手摸手教你 ES11 中引入随机数生成器的使用

    在前端开发中,随机数生成器是一个很重要的工具,它可以用于很多地方,比如生成验证码、随机选取商品等等。 在 ES11 中,我们可以引入 Math.random(),来生成随机数。

    4 天前
  • 解决自定义元素异步渲染时数据出错的问题

    在前端开发中,我们常常会使用自定义元素来实现一些高度复杂的功能。但是,当我们使用异步渲染时,有时会遇到数据出错的问题。在这篇文章中,我将详细介绍这个问题的原因,并提供一些解决方案。

    4 天前
  • 让 Web Components 响应式:实现自适应布局

    Web Components 是一个比较新的技术,使得开发人员可以创建可重用的自定义 HTML 标签和组件。然而,这些组件可能会出现在不同大小和屏幕上,因此我们需要确保它们具有响应式布局并能适应不同的...

    4 天前
  • 如何在 Tailwind 中定义自己的颜色主题?

    当我们在开发网站或应用程序时,颜色主题是至关重要的一部分。Tailwind 可以方便地处理样式,但如果我们想要使用自己的颜色和色调,该怎么办?在本文中,我将向您展示如何在 Tailwind 中定义自己...

    4 天前
  • 了解 GraphQL concepts - 对开发有所帮助

    了解 GraphQL concepts - 对开发有所帮助 在现代Web开发中,GraphQL已经变得越来越重要。尽管Restful API在过去十年中变得非常流行,GraphQL在最近几年中已迅速提...

    4 天前
  • 在 Mocha 测试框架中使用 ES6 的方法指南

    在前端开发中,自动化测试已经成为必不可少的一部分。而 Mocha 是当前比较流行的一种 JavaScript 测试框架。随着 ES6 新特性的应用,如何在 Mocha 中使用 ES6 的方法也成为了一...

    4 天前

相关推荐

    暂无文章