npm 包 @johnydays/express-graphql 使用教程

阅读时长 11 分钟读完

在前端开发领域中,Graphql 是一种非常流行的 API 查询语言。而 @johnydays/express-graphql 则是一个便捷且易于使用的 npm 包,用于在 Express 应用中使用 Graphql。在本篇文章中,我们将深入探讨 @johnydays/express-graphql 的使用方法,并提供详细的代码示例。

安装

使用 npm 安装 @johnydays/express-graphql:

基本用法

下面是一个使用 @johnydays/express-graphql 的基本示例,我们需要导入该包并使用 graphqlHTTP 方法创建一个 Graphql 中间件:

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

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

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

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

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

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

在上面的示例代码中,我们通过 buildSchema 方法创建了一个 Graphql Schema。在 Schema 中,我们定义了一个查询 hello,它的返回值类型为 String

接下来,我们定义了一个名为 rootValue 的对象,它包含了一个 hello 方法,当查询 hello 时,该方法会被调用。

然后,我们创建了一个 Express 应用,并在 '/graphql' 路径下使用 @johnydays/express-graphql 中间件。在中间件的配置项中,我们传入了创建的 Schema 和 rootValue 对象。

最后,我们通过 app.listen 启动了应用,并在控制台输出了提示信息。

在浏览器中访问 http://localhost:3000/graphql,即可打开 Graphql IDE;在 IDE 中输入查询语句 { hello },并点击运行按钮,会得到文字 Hello World! 的返回结果。

处理请求和错误

@johnydays/express-graphql 中间件提供了 formatErrorformatResponse 两个配置项,用于处理请求和错误。

我们可以使用 formatError 对 Graphql 的错误进行自定义处理,在许多案例中,这非常有用。例如,可以用该方法将错误信息记录到日志中。

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

上面示例代码,我们使用 console.log 打印错误信息,并将错误对象返回。在实际开发中,我们可以将错误信息保存在日志文件中,以便日后排查错误。

另外,我们也可以使用 formatResponse 对 Graphql 的响应进行自定义处理。例如,可以通过该方法对响应结果进行加工或过滤。

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

上面的示例代码中,我们在 formatResponse 方法中对 Graphql 的响应进行了自定义处理。如果响应中存在错误,我们会将错误信息修改为一个自定义的错误信息。这种方式可以避免向用户暴露过多的技术细节。

处理请求体

默认情况下,@johnydays/express-graphql 中间件在请求体中解析 Graphql 查询。然而,对于某些环境或特定场景,可能无法直接从请求体中解析查询时,我们可以使用 Graphql 的 parse 函数手动解析查询语句。

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

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

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

上面的示例代码中,我们手动解析了请求体中的查询语句,并调用 Graphql 的 graphql 方法进行查询。在上述代码示例中,我们使用了 Express 应用的 post 方法来处理 Graphql 查询,并使用 ast 来执行查询。parse 方法可以用来解析查询语句,并根据需求进行额外的处理。

自定义 GraphQL 关联类型

GraphQL 中有一种非常有用的类型,称为“关联类型”(Relay)。可以使用关联类型来连接查询,从而避免重复的查询。然而,@johnydays/express-graphql 中间件不直接支持这种类型。

不过,我们可以使用 Graphql 的接口来定义自己的关联类型。

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

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

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

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

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

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

上面的代码示例中,我们使用 Graphql 的 nodeDefinitions 方法定义了自己的接口,以方便查询和使用。这个接口会被用于定义 UserTypeCommentType 的关联类型。

UserType 中,我们定义了关联类型 comments,该字段连接了 UserTypeCommentType(即评论),使得查询用户时,也可以同时查询其评论列表。

CommentType 中,我们定义了关联类型 user,该字段连接了 CommentTypeUserType(即用户),使得查询评论时,也可以同时查询评论所属用户的信息。

最后,我们将定义好的 UserTypeCommentType 作为参数,创建了 RootQueryTypeRootMutationType。并将它们作为参数,创建了一个 GraphQLSchema。这样,我们就可以使用 @johnydays/express-graphql 中间件,将定义好的 Schema 部署到我们的应用中了。

结语

@johnydays/express-graphql 提供了一种非常方便的方法,用于在 Express 应用程序中使用 Graphql。在本文中,我们提供了详细的代码示例,向大家展示了如何使用该包来构建 Graphql API。除此之外,我们还介绍了如何处理 Graphql 的请求和错误,以及如何自定义 GraphQL 关联类型。我们希望这篇文章能够对你在应用程序开发中使用 Graphql 提供一些帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066bc4967216659e2442fe

纠错
反馈