使用 GraphQL 和类型 ORM 管理数据关系

阅读时长 9 分钟读完

在前端应用程序中,管理数据关系是一项常见任务。通常,这是通过编写与后端 API 的 REST 调用来完成的。然而,REST 风格的 API 非常繁琐,很难管理多个数据关系。GraphQL 提供了一种更简单、灵活和一致的方法来管理数据关系。

ORM(Object Relational Mapping,对象关系映射)是一种将对象模型与关系型数据库的数据模型进行映射的模式。ORM 可以简化为应用程序和数据库之间的交互,使开发人员可以使用面向对象的方法来操作数据库。

在本文中,我们将学习如何使用 GraphQL 和类型 ORM 来管理数据关系。

前置知识

  • 基础的 JavaScript 和 ES6 知识
  • 了解 GraphQL 概念与使用
  • 熟悉类型 ORM 框架,如 TypeORM

准备工作

我们将使用 Node.js 编写后端代码,并使用 TypeScript 和 TypeORM 作为 ORM 框架。

首先,我们需要在项目中安装必要的依赖:

接着,我们需要创建一个 tsconfig.json 文件,它将告诉 TypeScript 编译器如何编译我们的代码。

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

然后,在项目的根目录下创建一个 src 文件夹,我们将在其中编写所有的代码文件。在 src 文件夹下创建以下文件:

  • entity/User.ts:定义用户实体
  • entity/Post.ts:定义文章实体
  • resolver/UserResolver.ts:定义用户的 GraphQL Resolver
  • resolver/PostResolver.ts:定义文章的 GraphQL Resolver
  • schema.ts:定义 GraphQL Schema
  • index.ts:启动服务器

定义实体

在本例中,我们将创建两个实体:用户和文章。我们将使用 TypeORM 来定义这些实体。创建 src/entity/User.tssrc/entity/Post.ts 文件,并定义它们的实体类。

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

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

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

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

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

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

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

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

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

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

这些实体类会自动生成数据库表,这些表将存储我们的用户和文章数据,以便我们可以使用 TypeORM 轻松地进行数据操作。

定义 GraphQL Resolver

我们还需要为用户和文章定义 GraphQL Resolver。Resolver 将为应用程序提供数据,并在应用程序与前端之间建立联系。

创建 src/resolver/UserResolver.tssrc/resolver/PostResolver.ts 文件,并定义它们的 Resolver。

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

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

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

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

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

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

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

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

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

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

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

这些 Resolver 为每个实体定义了查询和创建方法,同时还定义了用于关联查询的 FieldResolver。

定义 GraphQL Schema

我们还需要创建 GraphQL Schema,定义 Resolver 中的查询和创建方法。

创建 src/schema.ts 文件,并定义 GraphQL Schema。

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

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

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

这个函数将动态地构建 GraphQL Schema。

启动服务器

现在我们已经完成了所有准备工作,我们需要编写一个 index.ts 文件来启动服务器。我们将创建一个 Express 应用程序,并使用 Apollo Server 和已经定义的 GraphQL Schema 为其提供服务。

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

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

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

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

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

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

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

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

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

在这个文件中,我们还连接了数据库,然后将 Apollo Server 集成到应用程序中。我们还定义了应用程序的监听端口,以及启动服务器时的输出消息。

总结

使用 GraphQL 和类型 ORM 管理数据关系可以大大简化应用程序中的数据操作。TypeORM 提供了一种与数据库进行交互的简单方法,而 GraphQL 则允许我们通过类型安全的查询和关联查询来检索数据。在开发前端应用程序时,这些技术可以极大地提高开发效率,并统一数据源。

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

纠错
反馈