如何处理 GraphQL 中的文件上传

GraphQL 是一种用于 API 开发的查询语言和运行时环境。它可以与多种后端语言和数据库集成,并且其灵活性也为前端提供了更好的开发体验。然而,与传统的 RESTful API 不同的是,GraphQL 并不支持简单的文件上传。本文将介绍在 GraphQL 中处理文件上传的方式,并提供示例代码。

概述

GraphQL 自身并不支持文件上传,但可以使用第三方包来达到该目的。其中,最常用的包是 apollo-upload-clientgraphql-upload。前者是 Apollo 官方提供的包,可以在前端和后端同时使用;而后者则是纯 JavaScript 实现的,可以在任何语言和平台上使用。

逐步实现

前端实现

安装依赖

在前端项目中安装 apollo-upload-client

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

创建上传组件

接下来,我们创建一个上传组件,用于选择文件和上传文件。示例代码如下:

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

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

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

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

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

定义 GraphQL Mutation

接下来,我们需要在 GraphQL 服务端中定义 Upload Mutation。示例代码如下:

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

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

创建 Apollo 实例

接下来,我们需要创建 Apollo 客户端实例,并将 apollo-link-httpapollo-upload-client 包分别传递给该实例。示例代码如下:

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

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

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

后端实现

安装依赖

我们需要安装 graphql-upload 包,用于处理文件上传。示例代码如下:

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

配置 Express

我们使用 Express 作为 GraphQL 服务端,需要用 graphql-upload 包提供的 graphqlUploadExpress 函数来配置 Express。示例代码如下:

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

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

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

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

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

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

处理文件上传

最后,在 GraphQL 服务端的 Resolver 中,我们需要处理文件上传。示例代码如下:

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

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

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

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

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

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

结论

上述就是使用 apollo-upload-clientgraphql-upload 包处理 GraphQL 中的文件上传的方法。虽然这不是标准的 GraphQL API,但这种方法已被广泛采用,并且很容易在实现 GraphQL API 时遇到。希望这篇文章能对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/671714d1ad1e889fe21f9c76